你如何实现和 nullBadDataFound

如何解决你如何实现和 nullBadDataFound

根据 CsvHelper 入门中的说明,除了 csv.Configuration.BadDataFound 行之外,我还有以下代码

using (var csv = new CsvReader(tr,CultureInfo.InvariantCulture))
        {
            List<string> badPeople = new List<string>();
            csv.Configuration.BadDataFound = context => badPeople.Add(context.RawRecord);
            try
            {
                var people = csv.GetRecords<Person>();
                var count = people.Count();
                response = await Http.PostAsJsonAsync("api/people/batch",people);
                Message = $"{response}: {selectedFile.Count} file uploaded";
            }
            catch (Exception ex)
            {
                Message = ex.Message;
            }
        }

我根据以下建议配置了 BadDataFound 行:

在 CsvHelper.Configuration 文档中,它指出:

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

我不断收到 BadDataFound 没有设置器的错误,根据我在 GitHub 上查看代码时看到的内容,这是有道理的。我在没有 BadDataFound 行的情况下运行时收到的错误消息指出,可以通过将 BadDataFound 置空来忽略它。

更复杂的是,在我能找到的上下文中也没有“RawRecord”。

我如何让它发挥作用?

解决方法

Version 20.0.0 中,Josh “将 CsvConfiguration 更改为只读记录以消除线程问题。”您需要提前创建配置并将其传递到 CsvReader/CsvWriter

RawRecord 现在在解析器上。

然而,我注意到它会创建一条记录,即使有错误数据,它也会将 RawRecord 两次输入 badPeople

void Main()
{
    var badPeople = new List<string>();
    var Message = string.Empty;
    var people = new List<Person>();
    
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        BadDataFound = arg => badPeople.Add(arg.Context.Parser.RawRecord)
    };

    using (var tr = new StringReader("Id,FirstName,LastName\n1,Foo,Bar\n2,Foo\"Bar,Baz\n3,Foo\"Baz,Bar"))
    using (var csv = new CsvReader(tr,config))
    {       
        try
        {
            people = csv.GetRecords<Person>().ToList();
            var count = people.Count();
        }
        catch (Exception ex)
        {
            Message = ex.Message;
        }
    }
    people.Dump();
    badPeople.Dump();
}

public class Person 
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?