Lumenworks Fast Csv Reader - 由于引号字符,读取制表符分隔文件时出现异常错误

2024-04-19

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

CSV 似乎在位置“1169”处的记录“1281”字段“5”附近已损坏

该文件以制表符分隔。在那里我发现使用了双引号,但我不知道如何转义它并正常恢复,因为它是制表符分隔的数据。

--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:

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 and 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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lumenworks Fast Csv Reader - 由于引号字符,读取制表符分隔文件时出现异常错误 的相关文章

随机推荐