CsvHelper:用另一个表达式替换缺失的 Csv 字段?

问题描述 投票:0回答:2

当 CSV 文件中缺少某个字段时,会引发异常。当字段丢失时,我宁愿映射另一个值(例如空字符串)。

Map(dest => dest.PatientID).Name("Patient ID");

CsvHelper.CsvMissingFieldException: 'Fields 'Patient ID' do not exist in the CSV file.'

如果使用配置设置 IgnoreReadingExceptions,则不会将任何记录读入结果中。

var csv = new CsvReader(sr);
csv.Configuration.RegisterClassMap<TMap>();
csv.Configuration.IgnoreReadingExceptions = true;
records = csv.GetRecords<TR>().ToList();

如何更改映射,以便当映射字段丢失时,可以用另一个表达式替换它?

c# automapper csvhelper
2个回答
16
投票

在 2.x 中你可以这样做:

csv.Configuration.WillThrowOnMissingField = false;

在 3.x 中你可以这样做:

// Turn off.
csv.Configuration.MissingFieldFound = null;


// Log missing field.
csv.Configuration.MissingFieldFound = ( headerNames, index, context ) =>
{
    logger.WriteLine( $"Field with names ['{string.Join( "', '", headerNames )}'] at index '{index}' was not found. ");
};

0
投票

在更高版本中,CsvReader 配置是只读的,例如这不再起作用:

csv.Configuration.MissingFieldFound = null;

您可以在之前的配置中设置

比如 30.x 你可以使用这样的东西:

var config = new CsvHelper.Configuration.CsvConfiguration(System.Globalization.CultureInfo.InvariantCulture)
{
    MissingFieldFound = args => { 
        logger.WriteLine( $"Field with names ['{string.Join( "', '", args.HeaderNames)}'] at index '{args.Index}' was not found. ");
        //do something with (args.Index, args.HeaderNames,args.Context. 
    }
};

或者什么都没有

var config = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
{
    MissingFieldFound = () => { }
};

然后使用配置:

using (var csvReader = new CsvReader(reader, config))
© www.soinside.com 2019 - 2024. All rights reserved.