我正在成功使用类CsvReader
并对此感到满意,但是,我使用的文件是由一个更改列格式而不让我知道的组生成的。
所以,有一刻一切正常,然后第二天早上事情中断,csv.GetRecord<MyType>()
周围的try catch块捕获错误并记录错误,但是我无法从Exception实例中收集任何有价值的信息。它只是说:“无法进行转换。”并且InnerException
什么都没有。不是很有用。我甚至不知道我的150列中的哪一列导致了这个问题。
你能帮我弄清楚如何确定哪一行导致问题的哪一列?
由于
答案 0 :(得分:44)
目前,无法忽略字段/属性级别的错误。您目前的选择是这些:
查看异常数据。
catch( Exception ex )
{
// This contains useful information about the error.
ex.Data["CsvHelper"];
}
忽略读取异常。这是在行级别,但不是字段。它将允许仍然读取整个文件,并忽略不起作用的行。发生异常时,您可以获得回调。
csv.Configuration.IgnoreReadingExceptions = true;
csv.Configuration.ReadingExceptionCallback = ( ex, row ) =>
{
// Do something with the exception and row data.
// You can look at the exception data here too.
};
答案 1 :(得分:6)
首先,我似乎需要捕获CsvTypeConverterException。
while (csv.Read())
{
try
{
var record = csv.GetRecord<MyType>();
}
catch (CsvTypeConverterException ex)
{
//ex.Data.Values has more info...
}
}
我现在知道如何调查出了什么问题,但是如何确保跳过该字段但该行中的其余字段已被转换,以便不会丢弃整行?
由于
答案 2 :(得分:0)
CsvHelper 在 CsvReader 中具有公共的“上下文”字段,并且需要显示问题的所有条件:
try
{
var records = csvReader.GetRecords<MyType>().ToList();
}
catch (CsvHelperException e)
{
Console.WriteLine($"{e.Message} " + (e.InnerException == null ? string.Empty : e.InnerException.Message));
Console.WriteLine($"Row: {csvReader.Context.Row}; RawLine: {csvReader.Context.RawRecord}");
if (csvReader.Context.CurrentIndex >= 0 &&
csvReader.Context.CurrentIndex < csvReader.Context.HeaderRecord.Length)
{
Console.WriteLine($"Column: {csvReader.Context.CurrentIndex}; ColumnName: {csvReader.Context.HeaderRecord[csvReader.Context.CurrentIndex]}");
}
throw;
}