如何检测一行是否有额外的列(超过标题)



在读取CSV文件时,如何配置CsvHelper以强制每行没有在标头中找不到的额外列?在CsvConfigurationCsvHelper.Configuration.Attributes下都找不到明显的性质。

上下文:在我们的CSV文件格式中,最后一列是字符串描述,当描述包含逗号时,我们的用户(使用纯文本编辑器(有时会忘记引用它。这样的";生的";逗号会导致该行具有额外的列,并且读取到软件中的预期描述会省略第一个原始逗号之后的描述。我想检测到这一点,并抛出一个异常,向用户表明他们可能忘记引用描述单元格。

看起来CsvConfiguration.DetectColumnCountChanges可能是相关的,但目前29.0.0库缺少对CsvConfiguration属性的任何Intellisense描述,所以我不知道如何使用它。

其他CSV库的类似信息:

  • 使用LINQtoCSV,这是通过在CsvFileDescription中设置IgnoreUnknownColumns = false来完成的
  • 当一行中有太多列时,Lumenworks CSV解析器会出错吗

您使用CsvConfiguration.DetectColumnCountChanges是正确的。

void Main()
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
DetectColumnCountChanges = true
};

using (var reader = new StringReader("Id,Namen1,MyNamen2,YourName,ExtraColumn"))
using (var csv = new CsvReader(reader, config))
{
try
{           
var records = csv.GetRecords<Foo>().ToList();
}
catch (BadDataException ex)
{
if (ex.Message.StartsWith("An inconsistent number of columns has been detected."))
{
Console.WriteLine("There is an issue with an inconsistent number of columns on row {0}", ex.Context.Parser.RawRow);
Console.WriteLine("Row data: "{0}"", ex.Context.Parser.RawRecord);
Console.WriteLine("Please check for commas in a field that were not properly quoted.");
} 
}

}
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}

最新更新