在 StreamReader
后面缺少一个闭合括号:
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 (e.Error is MissingFieldCsvException)
{
e.Action = ParseErrorAction.AdvanceToNextLine;
}
else if (e.Error is MalformedCsvException)
{
e.Action = ParseErrorAction.AdvanceToNextLine;
}
else
{
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);
}
}