如何使用CSV Helper将原始CSV行数据填充到实体属性中?
解决方法
首先,先取消Data类中OriginalRecord属性的注释,确保它可以被赋值:
public class Data { public int Id { get; set; } public string Name { get; set; } public string? OriginalRecord { get; set; } // 启用该属性 }
下面提供两种可行的实现方案:
方式一:遍历记录时手动获取原始行
由于GetRecords<T>是延迟执行的,你可以在遍历过程中通过csv.Context.Parser.RawRecord获取当前行的原始文本,再赋值给OriginalRecord:
using (var reader = new StreamReader("file.csv")) using (var csv = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = false })) { var records = new List<Data>(); while (csv.Read()) { var record = csv.GetRecord<Data>(); record.OriginalRecord = csv.Context.Parser.RawRecord; records.Add(record); } }
方式二:使用自定义类映射(ClassMap)
通过创建自定义ClassMap,在映射流程中注入原始行数据,这种方式更贴合CsvHelper的映射规范:
public class DataMap : ClassMap<Data> { public DataMap() { Map(m => m.Id).Index(0); Map(m => m.Name).Index(1); Map(m => m.OriginalRecord).Convert(args => args.Context.Parser.RawRecord); } }
之后在读取CSV时注册该映射即可:
using (var reader = new StreamReader("file.csv")) using (var csv = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = false })) { csv.Context.RegisterClassMap<DataMap>(); var records = csv.GetRecords<Data>().ToList(); }
两种方案都能实现将每条记录对应的原始CSV行填充到OriginalRecord属性中,可根据代码风格选择合适的方式。
内容的提问来源于stack exchange,提问作者Peter Poulsen
相关产品推荐
相关产品推荐

