如何使用CsvClassMap将不同列名的CSV映射到目标类属性
带表头CSV到Class1属性的映射实现方案
核心修改点
- 启用表头识别:将
HasHeaderRecord配置设为true,让CsvReader读取CSV的表头行 - 调整映射规则:把原
Class1Map中按索引映射的逻辑,改为按新CSV的列名对应映射
修改后的完整代码
CSV读取主逻辑
sr = new StreamReader(fs); fs = null; using (CsvReader csvReader = new CsvReader(sr)) { sr = null; // 启用表头识别,适配新CSV格式 csvReader.Configuration.HasHeaderRecord = true; csvReader.Configuration.IgnoreBlankLines = false; csvReader.Configuration.IgnoreReadingExceptions = true; csvReader.Configuration.WillThrowOnMissingField = false; csvReader.Configuration.TrimFields = true; csvReader.Configuration.RegisterClassMap<Class1Map>(); FileRecords = csvReader.GetRecords<Class1>().ToList(); }
修改后的Class1Map映射类
public class Class1Map : CsvClassMap<Class1> { public Class1Map() { // 按新CSV列名映射到Class1对应属性 Map(m => m.AccountId).Name("AccountRef"); Map(m => m.MeterId).Name("MeterSerial"); // 其他属性同理,替换为对应的新列名 // ....... } }
兼容新旧CSV的扩展方案(可选)
如果需要同时支持无表头(旧格式)和有表头(新格式)的CSV,可通过参数判断动态选择映射规则:
新增无表头专用映射类
public class Class1IndexMap : CsvClassMap<Class1> { public Class1IndexMap() { Map(m => m.AccountId).Index(0); Map(m => m.MeterId).Index(1); // 其他属性按原索引映射 // ....... } }
动态注册映射类
using (CsvReader csvReader = new CsvReader(sr)) { sr = null; csvReader.Configuration.HasHeaderRecord = hasHeaderRecord; csvReader.Configuration.IgnoreBlankLines = false; csvReader.Configuration.IgnoreReadingExceptions = true; csvReader.Configuration.WillThrowOnMissingField = false; csvReader.Configuration.TrimFields = true; // 根据是否有表头选择对应映射规则 if (hasHeaderRecord) { csvReader.Configuration.RegisterClassMap<Class1Map>(); } else { csvReader.Configuration.RegisterClassMap<Class1IndexMap>(); } FileRecords = csvReader.GetRecords<Class1>().ToList(); }
内容的提问来源于stack exchange,提问作者user768853
相关产品推荐
相关产品推荐

