c# - 在 CsvHelper 中处理错误的 CSV 记录

标签 c# csv csvhelper

我希望能够遍历 CSV 文件中的所有记录,并将所有好的记录添加到一个集合中,并分别处理所有“坏的”记录。我似乎无法做到这一点,我想我一定遗漏了一些东西。

如果我 try catch BadDataException,那么后续读取将失败,这意味着我无法继续读取文件的其余部分 -

while (true)
{
    try
    {
        if (!reader.Read())
            break;

        var record = reader.GetRecord<Record>();
        goodList.Add(record);
    }
    catch (BadDataException ex)
    {
        // Exception is caught but I won't be able to read further rows in file
        // (all further reader.Read() result in same exception thrown)
        Console.WriteLine(ex.Message);
    }
}

讨论的另一个选项是设置 BadDataFound 回调操作来处理它 -

reader.Configuration.BadDataFound = x =>
{
    Console.WriteLine($"Bad data: <{x.RawRecord}>");
};

然而,尽管调用了回调,但不良记录仍然出现在我的“良好列表”中

在将记录添加到我的列表之前,有什么方法可以查询读者以查看记录是否良好?

对于这个例子,我的 Record 定义是 -

class Record
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

和数据(第一行坏,第二行好)-

"Jo"hn","Doe",43
"Jane","Doe",21

有趣的是,使用 MissingFieldException 处理缺失的字段似乎完全按照我的意愿运行 - 异常被抛出,但后续行仍然读取正常。

最佳答案

这是 example我提供了。

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("\"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);
        };
        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; }
}

关于c# - 在 CsvHelper 中处理错误的 CSV 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46848741/

相关文章:

c# - 如何使用 csvhelper 读取文件夹中的多个 csv 文件

c# - 无法将大量数据写入流

c# - 如何在学校的 Linux 服务器上运行 C# 程序?

iphone - UITextChecker : Memory Issue With Learning Thousands Of Words

python - 在 csv 文件中添加填充以使数据框可供 pandas 读取

linux - 删除重复项并首先保留在 unix 中的 csv 文件中

string - 向 CsvHelper 添加可检测的 Nullable 值

c# - 如何在 asp.net mvc 应用程序中附加 APPS 所需的共享点参数?

c# - 如何通过前缀从 azure 存储中获取 blob,同时忽略虚拟文件夹?

c# - 为什么此脚本在 C# 中无法正常工作,而在 PowerShell ISE 中却可以正常工作