我正在使用LumenWorks快速CSVReader,并且在阅读Kelley Blue Book的文件时发生了异常错误:
CSV似乎在记录'1281'field'5处损坏,位置为'1169'
文件选项卡。在那里,我发现使用了双引号,但我看不到如何逃脱并正常恢复,因为它是标签的数据。
--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
update ,根据您的评论和提供的文字文件:
此CSV阅读器使FillError
和ParseError
由无效或损坏的数据提出的异常。因此,您可以处理它们以获取更多信息并出于伐木目的。
例如:
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
之类的数据。因此,该字段本身包含引号。相反,您根本不需要一个,因为没有引用字段。因此,不要在构造函数中提供一个或将其设置为' '
。然后这没有问题而运行:
using(var rd = new StreamReader(filePath))
using (var csvReader = new CsvReader(rd, false, 't', ' ', ' ', '#', 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<string>();
for (int i = 0; i < fieldCount; i++)
{
fields.Add(csvReader[i]);
}
lines.Add(fields);
}
}