CSV文件空白字段错误与CSVHelper c#



我有一个问题,阅读这个文件与CSVHelper,例如,我怎么能使用一个ShouldSkipRecord不接收异常?我试图保持我所有的地图列可选,但不工作。

屏幕截图数据类:

public class WheelProsAccessoriesInventoryItem : WheelProsBaseInventoryItem
{
public override string PartNumber { get; set; }
public override string PartDescription { get; set; } 
public override string Brand { get; set; } 
public string CapHardwareDescription { get; set; } 
public string CapScrewQuantity { get; set; } 
public string CapWrench { get; set; } 
public string CapStyleDescription { get; set; } 
public string ImageURL { get; set; } 
public override string TotalQOH { get; set; } 
public override string Msrp { get; set; } 
public override string Map { get; set; } 
public override string RunDate { get; set; } 
public override string StockLa1 { get; set; } 
public override string num1015 { get; set; } 
public override string num1019 { get; set; } 
public override string num1022 { get; set; } 
public override string num1028 { get; set; } 
public override string StockLa2 { get; set; } 
public override string num1036 { get; set; } 
public override string num1071 { get; set; } 
public override string num1072 { get; set; } 
public override string num1082 { get; set; }  
public override string StockLa3 { get; set; } 
public override string StockTX { get; set; } 
public override string num1092 { get; set; } 
public override string StockLangley { get; set; } 
public override string StockToronto { get; set; } 
public int LineNumber { get; set; }
}
}

地图:

public class WheelProsAccessoriesInventoryItemMap : ClassMap<WheelProsAccessoriesInventoryItem>
{**
public WheelProsAccessoriesInventoryItemMap()
{
Map(m => m.PartNumber).Name("PartNumber");
Map(m => m.Brand).Name("Brand");
Map(m => m.PartDescription).Name("PartDescription");

Map(m => m.CapHardwareDescription).Name("CapHardwareDescription").Optional();
Map(m => m.CapScrewQuantity).Name("CapScrewQuantity").Optional();
Map(m => m.CapWrench).Name("CapWrench").Optional();
Map(m => m.CapStyleDescription).Name("CapStyleDescription").Optional();
Map(m => m.ImageURL).Name("ImageURL");

Map(m => m.TotalQOH).Name("TotalQOH");
Map(m => m.Msrp).Name("MSRP");
Map(m => m.Map).Name("MAP");
Map(m => m.RunDate).Name("RunDate"); 
// StockWarehouses
// 1011 – Stock LA1 Warehouse
Map(m => m.StockLa1).Name("1011");
// 1031 - Stock LA2 Riverside
Map(m => m.StockLa2).Name("1031");
// 1085 – Stock LA3 LA Warehouse Support
Map(m => m.StockLa3).Name("1085");
// 1086 - StockTX Dallas Warehouse
Map(m => m.StockTX).Name("1086");
// 4033 - Stock Langley/Vancouver
Map(m => m.StockLangley).Name("4033");
// 4035 - Stock Toronto
Map(m => m.StockToronto).Name("4035");
// 1088 - Stock US - Atlanta Logistics Center
Map(m => m.num1088).Name("1088"); 
Map(m => m.num1015).Name("1015").Optional();
Map(m => m.num1019).Name("1019").Optional();
Map(m => m.num1022).Name("1022").Optional();
Map(m => m.num1028).Name("1028").Optional();
Map(m => m.num1036).Name("1036").Optional();
Map(m => m.num1071).Name("1071").Optional();
Map(m => m.num1072).Name("1072").Optional();
// Map(m => m.LineNumber).Convert(record => record.Row.Parser.Row);
}
}
}

阅读方法:

public static IEnumerable<T> GetRecords<T, TMap>(string filename, bool hasFrenchChars = false)
where T : class
where TMap : ClassMap<T>
{
var errorRecsCollection = new List<string>();
var malformedRow = false;

using (var streamReader = new StreamReader(filename))
{
using (var csvReader = new CsvReader(streamReader, CultureInfo.InvariantCulture))
{
csvReader.Context.RegisterClassMap<TMap>();

var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = ",",
HasHeaderRecord = true,
Encoding = hasFrenchChars ? Encoding.GetEncoding("ISO-8859-1") : Encoding.UTF8,
IgnoreBlankLines = true,

MissingFieldFound = null,

BadDataFound = context =>
{
malformedRow = true;
errorRecsCollection.Add(context.RawRecord);
}
};
//  var rowNumber = csvReader.Parser.Row;
return csvReader.GetRecords<T>().ToList();

}
}


}

我该怎么做才能忽略文件?我试着在下面添加这个配置,但不工作。

这就是我如何处理坏记录(所有代码在同一方法中)

var isRecordBad = false;
csv.Configuration.BadDataFound = context =>
{
isRecordBad = true;
bad.Add(context.RawRecord);
};
var records = csv.GetRecords<dynamic>(); //You can still use your type and map, dynamic is sometimes just easier for complicated mappings
foreach (var record in records)
{
var dictionary = record as IDictionary<string, object>;
if (!isRecordBad)
{
//keep the data - add to list
}
isRecordBad = false;
}

如果你决定走dynamic类型的路线,你也可以编写更少的代码,在生成WheelProsAccessoriesInventoryItem对象时只检查转换后的dictionary中的键