34

CsvReader成功地使用了该课程并且对此感到满意,但是,我使用的文件是由一个更改列格式而不让我知道的组生成的。

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

您能帮我弄清楚如何查明哪一行中的哪一列导致了问题吗?

谢谢

4

3 回答 3

50

目前,无法忽略字段/属性级别的错误。您当前的选择是:

查看异常数据。

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.
};
于 2014-04-10T19:08:44.637 回答
9

首先,看来我需要捕获 CsvTypeConverterException。

 while (csv.Read())
    {
       try
       {    
          var record = csv.GetRecord<MyType>();    
       }
       catch (CsvTypeConverterException ex)
       {
         //ex.Data.Values has more info...
       }
    }

我现在知道如何调查出了什么问题,但是如何确保跳​​过该字段但该行中的其余字段已转换,从而不会丢弃整行?

谢谢

于 2014-02-06T17:47:56.560 回答
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;
}
于 2020-12-14T13:38:50.010 回答