Lumenworks Fast CsvReader – 由于引号字符,读取制表符分隔文件的exception错误

我正在使用Lumenworks Fast CsvReader,并且在阅读Kelley Blue Book的文件时发生了exception错误:

在位于’1169’的记录’1281’字段’5附近,CSV似乎已损坏

该文件以制表符分隔。 在那里我发现使用双引号,但我没有看到如何逃避它并正常恢复,因为它是制表符分隔数据。

--Characters in Text File-- 12345 2013 RAV4 "Sport" Sport Utility 4D 2 --Source Code-- using(CsvReader csvReader = new CsvReader(new StreamReader(filePath), false, '\t', '"', '"', '#', LumenWorks.Framework.IO.Csv.ValueTrimmingOptions.QuotedOnly)) { } 

我尝试了许多不同的CsvReader设置而没有运气。 你用的是什么效果很好? 我用逗号分隔的文件没那么麻烦。

StreamReader后面有一个mssing结束括号:

 using (CsvReader csvReader = new CsvReader(new StreamReader(filePath), false, '\t', '"', '"', '#', LumenWorks.Framework.IO.Csv.ValueTrimmingOptions.All)) { int fieldCount = csvReader.FieldCount; while (csvReader.ReadNextRecord()) { for (int i = 0; i < fieldCount; i++) Console.WriteLine("Column {0}: {1}", i + 1, csvReader[i]); } } 

我用上面的行测试了它(强制标签作为文件中的分隔符)并且它有效。

产量是:

 Column 1: 12345 Column 2: 2013 Column 3: RAV4 Column 4: Sport Column 5: Sport Utility Column 6: 4D Column 7: 2 

根据您的评论和提供的文本文件更新:

此csv-reader可以处理由无效或损坏的数据引发的FillErrorParseErrorexception。 因此,您可以处理它们以获取更多信息并用于记录目的。

例如:

 void csv_ParseError(object sender, ParseErrorEventArgs e) { // if the error is that a field is missing, then skip to next line if (e.Error is MissingFieldCsvException) { //Log.Write(e.Error, "--MISSING FIELD ERROR OCCURRED!" + Environment.NewLine); e.Action = ParseErrorAction.AdvanceToNextLine; } else if (e.Error is MalformedCsvException) { //Log.Write(e.Error, "--MALFORMED CSV ERROR OCCURRED!" + Environment.NewLine); e.Action = ParseErrorAction.AdvanceToNextLine; } else { //Log.Write(e.Error, "--UNKNOWN PARSE ERROR OCCURRED!" + Environment.NewLine); e.Action = ParseErrorAction.AdvanceToNextLine; } } 

你需要听这个事件:

 csvReader.MissingFieldAction = MissingFieldAction.ParseError; csvReader.DefaultParseErrorAction = ParseErrorAction.RaiseEvent; csvReader.ParseError += csv_ParseError; 

我已经认识到使用"作为文本文件引用字符不起作用,因为某些字段包含RAV4 "Sport" Sport Utility 4D 。因此字段本身包含引号字符。相反,您不需要一个因为没有引用任何字段。所以不要在构造函数中提供一个或将其设置为'\0' 。然后运行没有问题:

 using(var rd = new StreamReader(filePath)) using (var csvReader = new CsvReader(rd, false, '\t', '\0', '\0', '#', ValueTrimmingOptions.All)) { csvReader.MissingFieldAction = MissingFieldAction.ParseError; csvReader.DefaultParseErrorAction = ParseErrorAction.RaiseEvent; csvReader.ParseError += csv_ParseError; csvReader.SkipEmptyLines = true; int fieldCount = csvReader.FieldCount; while (csvReader.ReadNextRecord()) { var fields = new List(); for (int i = 0; i < fieldCount; i++) { fields.Add(csvReader[i]); } lines.Add(fields); } }