在CsvHelper中如何捕获转换错误并知道它发生在哪个字段和哪一行?

时间:2014-02-06 17:03:34

标签: csvhelper

我正在成功使用类CsvReader并对此感到满意,但是,我使用的文件是由一个更改列格式而不让我知道的组生成的。

所以,有一刻一切正常,然后第二天早上事情中断,csv.GetRecord<MyType>()周围的try catch块捕获错误并记录错误,但是我无法从Exception实例中收集任何有价值的信息。它只是说:“无法进行转换。”并且InnerException什么都没有。不是很有用。我甚至不知道我的150列中的哪一列导致了这个问题。

你能帮我弄清楚如何确定哪一行导致问题的哪一列?

由于

3 个答案:

答案 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;
}