C# CsvHelper-验证整行 问题

C# CsvHelper-验证整行 问题,c#,csvhelper,C#,Csvhelper,我最近开始学习更多关于csvHelper的知识,我需要一个关于如何实现我的目标的建议 我有一个CSV文件,其中包含一些用户记录(数千到几十万条记录),我需要解析该文件并验证/处理数据。我需要做的是两件事: 我需要一种在读取整行时验证整行的方法 该记录包含日期范围,我需要验证它是否为有效范围 如果不是,我需要将有问题的行写入错误文件 一条记录也可以在不同的日期范围内多次出现,我需要验证这些范围是否重叠,如果重叠,则将整个原始行写入错误文件 我基本上可以通过一种方法来保存解析数据旁边的整个原

我最近开始学习更多关于csvHelper的知识,我需要一个关于如何实现我的目标的建议

我有一个CSV文件,其中包含一些用户记录(数千到几十万条记录),我需要解析该文件并验证/处理数据。我需要做的是两件事:

  • 我需要一种在读取整行时验证整行的方法

    • 该记录包含日期范围,我需要验证它是否为有效范围
    • 如果不是,我需要将有问题的行写入错误文件
  • 一条记录也可以在不同的日期范围内多次出现,我需要验证这些范围是否重叠,如果重叠,则将整个原始行写入错误文件

  • 我基本上可以通过一种方法来保存解析数据旁边的整个原始行,但是在原始数据仍然可用的情况下验证整个行的方法会更好


    问题 是否有一些事件/操作隐藏在某个地方,我可以在创建数据行之后但在将其添加到集合之前使用它们来验证该行数据?

    如果没有,是否有办法将整个原始行保存到记录中,以便我可以在解析该行后验证该行,如果该行无效,请执行我需要的操作?


    我有密码 我创建的记录类如下所示:

    class Record
    {  //simplified and omitted fluff for brevity
       string Login
       string Domain
       DateTime? Created
       DateTime? Ended
    }
    
    public ProcessFile(...)
    {
      ...
      using(var reader = StreamReader(...))
      using(var csvReader = new CsvReader(reader))
      using(var errorWriter = new StreamWriter(...))
      {
          csvReader.Configuration.RegisterClassMap(new RadekMapping(config));
          
          //...set up of csvReader configuration...
    
          try
          {
             var records = csvReader.GetRecords<Record>();
          }
          catch (Exception ex)
          {
             //..in case of problems...
          }
          ....
      }
      ....
    }
    
    和一个类映射:

    class RecordMapping<Record>
    {    //simplified and omitted fluff for brevity
         public RecordMapping(ConfigurationElement config)
         {
            //..the set up of the mapping...
         }
    }
    
    类记录映射
    {//为简洁起见,简化并省略了绒毛
    公共记录映射(ConfigurationElement配置)
    {
    //…映射的设置。。。
    }
    }
    
    然后像这样使用它们:

    class Record
    {  //simplified and omitted fluff for brevity
       string Login
       string Domain
       DateTime? Created
       DateTime? Ended
    }
    
    public ProcessFile(...)
    {
      ...
      using(var reader = StreamReader(...))
      using(var csvReader = new CsvReader(reader))
      using(var errorWriter = new StreamWriter(...))
      {
          csvReader.Configuration.RegisterClassMap(new RadekMapping(config));
          
          //...set up of csvReader configuration...
    
          try
          {
             var records = csvReader.GetRecords<Record>();
          }
          catch (Exception ex)
          {
             //..in case of problems...
          }
          ....
      }
      ....
    }
    
    公共进程文件(…) { ... 使用(var reader=StreamReader(…) 使用(var csvReader=新csvReader(读卡器)) 使用(var errorWriter=newstreamwriter(…) { RegisterClassMap(新的RadekMapping(配置)); //…设置csvReader配置。。。 尝试 { var records=csvReader.GetRecords(); } 捕获(例外情况除外) { //…如果出现问题。。。 } .... } .... }
    在这种情况下,从CsvHelper的角度来看,数据可能是“有效的”,因为它可以读取数据,但由于更复杂的原因(如无效的日期范围)无效

    在这种情况下,这可能是一种简单的方法:

    public IEnumerable ReadThings(文本阅读器)
    {
    var result=新列表();
    使用(var csvReader=新csvReader(文本阅读器))
    {
    while(csvReader.Read())
    {
    var thing=csvReader.GetRecord();
    如果(是有效的(事物))
    结果:添加(事物);
    其他的
    物流验证(物);
    }
    }
    返回结果;
    }
    
    如果需要记录的是原始文本,则应为:

    LogInvalidRow(csvReader.Context.RawRecord);
    
    另一个选择——也许是更好的选择——可能是将验证与读取完全分离。换句话说,只需读取记录而不进行验证

    var records = csvReaader.GetRecords<Record>(); 
    
    var records=csvReaader.GetRecords();
    
    您的reader类返回它们,而不负责确定哪些是有效的 以及如何处理它们

    然后另一个类可以验证
    IEnumerable
    ,返回有效行并记录无效行


    这样,验证和日志记录的逻辑就不会与读取代码绑定在一起。如果您从CSV文件以外的其他文件获取
    记录
    的集合,则测试和重用将更加容易。

    在这种情况下,从CsvHelper的角度来看,数据可能“有效”,因为它可以读取数据,但由于更复杂的原因(如无效的日期范围)而无效

    在这种情况下,这可能是一种简单的方法:

    public IEnumerable ReadThings(文本阅读器)
    {
    var result=新列表();
    使用(var csvReader=新csvReader(文本阅读器))
    {
    while(csvReader.Read())
    {
    var thing=csvReader.GetRecord();
    如果(是有效的(事物))
    结果:添加(事物);
    其他的
    物流验证(物);
    }
    }
    返回结果;
    }
    
    如果需要记录的是原始文本,则应为:

    LogInvalidRow(csvReader.Context.RawRecord);
    
    另一个选择——也许是更好的选择——可能是将验证与读取完全分离。换句话说,只需读取记录而不进行验证

    var records = csvReaader.GetRecords<Record>(); 
    
    var records=csvReaader.GetRecords();
    
    您的reader类返回它们,而不负责确定哪些是有效的 以及如何处理它们

    然后另一个类可以验证
    IEnumerable
    ,返回有效行并记录无效行


    这样,验证和日志记录的逻辑就不会与读取代码绑定在一起。如果您从CSV文件以外的其他文件获取
    记录
    ,则测试和重复使用将更加容易。

    检查@Magnetron I did。它没有显示的是针对另一个字段进行验证的方法。我需要验证同一行中的一个日期和另一个日期,但在csvhelper.Check@Magnetron的示例或帮助中,我没有发现这一点。它没有显示的是针对另一个字段进行验证的方法。我需要验证同一行中的一个日期与另一个日期,但在csvhelper的示例或帮助中,我没有发现这一点。谢谢。我将使用第一种方法。第二种方法对我来说是不可能的,因为我需要保留未处理的行,如果该行出于逻辑原因无效,则需要将其记录在错误文件中……要获取完整的“原始”行,可以在调用
    GetRecord()之前,在读循环中访问
    csvReader.Context.RawRecord
    csvReader.Context.RawRecord
    在csvhelperThanks的第20版中已更改为
    csvReader.RawRecord
    。我将使用第一种方法。第二种方法对我来说是不可能的,因为我需要保留它