2014-11-03 171 views
4

解析csv文件時,如何定義特定的字段是必需的。基本上,我想確保一個給定的字段永遠不會是空的,如果是的話我想拋出一個異常。這裏是映射類:CSVHelper必填字段

public sealed class DataMapper : CsvClassMap<DataType> 
{ 
    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<DataType> data; 
using (var sr = new StreamReader(localFilePath)) 
{ 
    var reader = new CsvReader(sr); 
    reader.Configuration.RegisterClassMap<DataMapper>(); 
    data = reader.GetRecords<DataType>().ToList(); 
} 

目前,我只檢查數據列表中的結果如下:

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

我無法找到CSVHelper文檔中的內置功能。我錯過了什麼嗎?

回答

5

我可能做到這一點使用的ConvertUsing擴展:

public sealed class DataMapper : CsvClassMap<DataType> 
{ 
    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<string>("ThirdField"))) 
       throw new Exception("Oops, ThirdField is empty!"); 
      return row.GetField<string>("ThirdField"); 
     }); 
    } 
} 
+0

'Get'方法已被刪除,並由庫的新版本中的'GetField'方法取代 – 2017-01-23 15:29:52

+0

@HakamFostok謝謝,你應該在你在那裏時修復它:) – DavidG 2017-01-23 15:31:19

1

As suggested by the creator of CsvHelper here

暫時,我認爲你必須有 WillThrowOnMissingField = false,並運行一個循環,並檢查您的具體 必填字段。您可能只需在 第一次閱讀後檢查標題即可。

他的示例代碼:

csv.WillThrowOnMissingField = false; 
var list = new List<MyObject>(); 
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<MyObject>()); 
} 
+0

這僅用於檢查源文件是否有列。 OP要求確保該值不爲空。 – DavidG 2014-11-03 11:22:21

2

這裏是一個擴展API的解決方案:

public static class CsvHelperExtensions 
{ 
    public static CsvPropertyMap Required<T>(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<T>(columnName); 
     }); 
    } 
} 

用法:

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