如何在CsvHelper的CsvReader中仅映射指定字段,其余自动映射?
问题解答:CsvHelper 仅配置差异字段,其余自动映射
完全可以实现仅为类与表头名称不匹配的字段配置映射规则,其余字段自动匹配。你遇到的问题核心是:自定义ClassMap时,如果不调用AutoMap方法,CsvHelper只会映射你显式配置的字段,不会自动处理名称一致的字段。
正确实现方式
在自定义ClassMap的构造函数中,先调用AutoMap生成所有字段的默认映射规则,再覆盖需要自定义的字段映射,这样既能保留名称一致字段的自动匹配,又能修改差异字段的映射关系:
internal sealed class BlockTradeUploadMap : ClassMap<BlockTradeRequestItemInput> { public BlockTradeUploadMap() { // 先生成所有字段的默认映射 AutoMap(CultureInfo.InvariantCulture); // 再覆盖需要自定义的字段 Map(m => m.SecurityIdentifier).Name("Sid"); Map(m => m.SourceId).Name("GlobalBlockId"); } }
原理说明
AutoMap方法会根据类的属性名称,自动生成与CSV表头(经过你配置的PrepareHeaderForMatch处理后)匹配的映射规则。- 后续调用的
Map方法会覆盖对应字段的原有默认规则,实现差异化配置。 - 如果不调用
AutoMap,ClassMap中只有你显式配置的字段会被映射,其余字段会被直接忽略,这就是你之前只有两个字段能获取值的原因。
完整使用代码
你的工具类和CSV读取代码可以保持不变,只要确保ClassMap中正确调用AutoMap即可:
public static class CsvHelperUtil { public static CsvConfiguration GetConfiguration() { return new CsvConfiguration(CultureInfo.InvariantCulture) { MissingFieldFound = null, HeaderValidated = null, TrimOptions = TrimOptions.Trim, PrepareHeaderForMatch = header => Regex.Replace(header.Header, @"\s", string.Empty) }; } public static void ConfigureCsvReader<TU, TV>(CsvReader csv) where TV : ClassMap<TU> { csv.Context.TypeConverterCache.AddConverter<string>(new AsciiOnlyConverter()); csv.Context.RegisterClassMap<TV>(); } } // CSV读取逻辑 using var reader = new StreamReader(stream); using var csv = new CsvReader(reader, CsvHelperUtil.GetConfiguration()); CsvHelperUtil.ConfigureCsvReader<BlockTradeRequestItemInput, BlockTradeUploadMap>(csv);
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

