CSVHelper必填字段

解析csv文件时,如何定义特定字段是必需的。 基本上,我想确保给定字段永远不会为空,如果是,那么我想抛出一个exception。 这是映射类:

public sealed class DataMapper : CsvClassMap { public DataMapper() { Map(m => m.Field1).Name("FirstField"); Map(m => m.Field2).Name("SecondField"); Map(m => m.Field3).Name("ThirdField"); // this field should be mandatory } } 

和用法:

 List data; using (var sr = new StreamReader(localFilePath)) { var reader = new CsvReader(sr); reader.Configuration.RegisterClassMap(); data = reader.GetRecords().ToList(); } 

目前我只是检查数据列表中的结果如下:

 var numberOfInvalidRecords = data.Count(data => string.IsNullOrEmpty(data.Field3)); if (nullAccountHolderRecords > 0) { //handle } 

我无法在CSVHelper文档中找到内置function。 我错过了什么吗?

我可能会使用ConvertUsing扩展来做到这一点:

 public sealed class DataMapper : CsvClassMap { public DataMapper() { Map(m => m.Field1).Name("FirstField"); Map(m => m.Field2).Name("SecondField"); Map(m => m.Field3).ConvertUsing(row => { if(string.IsNullOrEmpty(row.GetField("ThirdField"))) throw new Exception("Oops, ThirdField is empty!"); return row.GetField("ThirdField"); }); } } 

这是一个扩展API的解决方案:

 public static class CsvHelperExtensions { public static CsvPropertyMap Required(this CsvPropertyMap map, string columnName) { return map.Name(columnName).ConvertUsing(row => { if (string.IsNullOrEmpty(row.GetField(columnName))) throw new CsvParserException($"{columnName} is required, but missing from row {row.Row}"); return row.GetField(columnName); }); } } 

用法:

 public CsvPersonMap() { Map(m => m.FirstName).Required("First"); Map(m => m.LastName).Name("Last"); Map(m => m.MiddleName).Required("Middle"); } 

正如CsvHelper的创建者所建议的那样 :

目前,我认为您必须拥有WillThrowOnMissingField = false并运行循环并检查您的特定必填字段。 您可以在第一次阅读后检查标题。

他的示例代码:

 csv.WillThrowOnMissingField = false; var list = new List(); var headerChecked = false; while( csv.Read() ) { if( !headerChecked ) { // check for specific headers if( !csv.FieldHeaders.Exists( "MyHeaderName" ) ) { throw new Exception( "message" ); } headerChecked = true; } list.Add( csv.GetRecord() ); }