C# Lumenworks Fast CsvReader-由于引号字符,读取选项卡定界文件时出现异常错误

C# Lumenworks Fast CsvReader-由于引号字符,读取选项卡定界文件时出现异常错误,c#,csv,lumenworks,C#,Csv,Lumenworks,我正在使用Lumenworks Fast CsvReader,读取Kelley Blue Book的文件时发生异常错误: 位置“1169”的记录“1281”字段“5”附近的CSV似乎已损坏 该文件以制表符分隔。在那里,我发现使用了双引号,但我不知道如何转义它并正常恢复,因为它是以制表符分隔的数据 --Characters in Text File-- 12345 2013 RAV4 "Sport" Sport Utility 4D 2 --Source Code-- usin

我正在使用Lumenworks Fast CsvReader,读取Kelley Blue Book的文件时发生异常错误:

位置“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]);
    }
}
根据您的评论和提供的文本文件更新

此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 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);
    }
}
使用(var rd=newstreamreader(filePath))
使用(var csvReader=new csvReader(rd,false,'\t','\0','\0','#',ValueTrimmingOptions.All))
{
csvReader.MissingFieldAction=MissingFieldAction.ParseError;
csvReader.DefaultParseErrorAction=ParseErrorAction.RaiseEvent;
csvReader.ParseError+=csv_ParseError;
csvReader.skipmptylines=true;
int fieldCount=csvReader.fieldCount;
while(csvReader.ReadNextRecord())
{
变量字段=新列表();
对于(int i=0;i
您遇到了什么错误?它说“CSV似乎在位置“1169”的记录“1281”字段“5”附近损坏。”您使用的是Lumenworks的哪个版本?我使用的是v3.8.0。我无法附加文本文件供任何人测试是否会发生错误。我也是。为什么你不能上传一个文件呢?你可以将链接粘贴到这里或你的问题中。很好!!!它工作得很好!!我从未听说过使用\0。很高兴知道这一点。我熟悉csv_ParseError()函数并将其用作委托。:-)非常感谢你的帮助!!!!
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);
    }
}