【问题标题】:Get the entire CSV line on error parsing or reading在错误解析或读取时获取整个 CSV 行
【发布时间】:2018-08-24 14:22:25
【问题描述】:

在解析错误时获取整个 Csv 行

对于CsvHelper,我们使用:

MissingFieldFound:

获取或设置找到缺失字段时调用的函数。默认 函数将抛出 CsvHelper.MissingFieldException。您可以提供自己的 函数来做其他事情,比如记录问题而不是抛出异常。 参数:headerNames、index、context

BadDataFound:

获取或设置在发现错误字段数据时调用的函数。一个领域 如果它包含引号并且该字段未引用(转义),则具有错误数据。你 可以提供您自己的功能来执行其他操作,例如记录问题 抛出异常。参数:上下文

在下面的 MCVE 中,只有 MissingFieldFound 捕获完整行,而 BadDataFound 没有。

static void Main()
{
    using (var stream = new MemoryStream())
    using (var writer = new StreamWriter(stream))
    using (var reader = new StreamReader(stream))
    using (var csv = new CsvReader(reader))
    {
        writer.WriteLine("FirstName,LastName");
        writer.WriteLine("\"Jon\"hn\"\",\"Doe\"");
        writer.WriteLine("\"JaneDoe\"");
        writer.WriteLine("\"Jane\",\"Doe\"");
        writer.Flush();
        stream.Position = 0;

        var good = new List<Test>();
        var bad = new List<string>();
        var isRecordBad = false;

        csv.Configuration.BadDataFound = context =>
        {
            isRecordBad = true;
            bad.Add(context.RawRecord);
        };

        csv.Configuration.MissingFieldFound = (headerNames, index, context) =>
        {
            isRecordBad = true;
            bad.Add(context.RawRecord);
        };

        while (csv.Read())
        {
            var record = csv.GetRecord<Test>();
            if (!isRecordBad)
            {
                good.Add(record);
            }

            isRecordBad = false;
        }

        good.Dump();
        bad.Dump();
    }
}

public class Test
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

我希望结果是:

"乔恩""","Doe"
“简多”

而不是:

"乔恩""", “简多”

对于包含大量列的长 Csv,该行的其余部分通常包含有价值的信息。

【问题讨论】:

  • Hacky,但您可以将 StreamReader 包装在您自己的 TextReader 实现中,因此您可以保留 CsvReader 读取的最后一行。假设它需要一个TextReader,那就是 - 我从未使用过 csvhelper。
  • 您为什么不将您想要的更改贡献给 CsvHelper GitHub:github.com/JoshClose/CsvHelper?
  • @C.Evenhuis,是的 CsvReader 采取 TextReader: CsvReader(TextReader reader)。但即使我有点害怕“自己的TextReader 实现”周末在几个小时后我可以读一两本书。你有没有可以在这个过程中帮助我的文档/书籍。
  • @Polyfun,我希望有人能指出我在上下文或流中错过的属性,读者部分。我只需要从 byte[] 转换,瞧。大多数时候都是这样。
  • @xdtTransform 这个博客已经记录了当前/最后一行:blogs.msdn.microsoft.com/jmstall/2005/08/06/…

标签: c# csv csvhelper


【解决方案1】:

你可以这样理解:

 csv.Parser.Context.RawRecord;

【讨论】:

  • 和context.RawRecord一样,可以在csv.Configuration.BadDataFound = context =&gt; { isRecordBad = true; bad.Add(context.RawRecord); };看到
  • 如问题中所述,它将在MissingFieldFound 中工作。但不在BadDataFound 中,当解析器到达BadDataFound 时,它会停止解析。当前只会显示什么是好的。在当前版本中,解析器无法从中恢复。并且不会让您继续 CSV 行。在这种特殊情况下,任何使用 csv.Parser 的东西都不起作用。
猜你喜欢
  • 2016-06-04
  • 2022-12-09
  • 2013-06-04
  • 2013-02-06
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
相关资源
最近更新 更多