我正在使用Lumenworks快速CsvReader,在读取凯利蓝皮书的文件时出现了异常错误:
CSV似乎在记录'1281‘字段'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设置,但没有成功。你用什么做得很好?对于逗号分隔的文件,我没有那么大的麻烦。
发布于 2014-02-06 14:22:04
在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读取器允许处理由无效或损坏的数据引发的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这样的数据。因此,字段本身包含引用字符。相反,您根本不需要一个字段,因为没有引用字段。因此,不要在构造函数中提供一个,也不要将其设置为'\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<string>();
for (int i = 0; i < fieldCount; i++)
{
fields.Add(csvReader[i]);
}
lines.Add(fields);
}
}https://stackoverflow.com/questions/21605345
复制相似问题