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