首页 > 解决方案 > 在错误解析或读取时获取整个 CSV 行

问题描述

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

使用CsvHelper我们使用:

MissingFieldFound

获取或设置在找到缺失字段时调用的函数。默认函数将引发 CsvHelper.MissingFieldException。您可以提供自己的函数来执行其他操作,例如记录问题而不是引发异常。参数:headerNames、索引、上下文

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”
“JaneDoe”

代替 :

“乔恩”、“简多”

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

标签: c#csvcsvhelper

解决方案


你可以得到这条线:

 csv.Parser.Context.RawRecord;

推荐阅读