CsvHelper中Record Map覆盖CSV其他字段问题求助
问题原因及解决方案
问题原因
你遇到的字段覆盖、列位置错误问题,核心是**Index(1,150)的索引范围与前面固定字段的索引冲突**:
- CsvHelper的
Index是从0开始计数的,你之前指定Result的列从索引1开始,占用1到150的位置,但前面的Forename已经占用索引1、Surname占用索引2……这些固定字段的索引和Result的索引范围完全重叠,导致Result的列直接覆盖了后续固定字段的位置,最终出现列头不匹配、字段值混乱的情况。 - 起始索引设为1,自然会让
Result列从文件第2列开始,而非预期的末尾。
解决方案
要让Result列表的列排在所有固定字段末尾,且不覆盖其他字段,只需给Result指定正确的起始索引——也就是前面固定字段的总数:
修改后的RecordMap代码
public class RecordMap : ClassMap<OutputRecord> { public RecordMap() { // 映射固定字段,按顺序占用索引0~5 Map(m => m.CustomerReference); Map(m => m.Forename); Map(m => m.Surname); Map(m => m.DOB); Map(m => m.Timestamp); Map(m => m.Score); // 指定Result从索引6开始(固定字段共6个),自动生成Result1、Result2...列 Map(m => m.Result).Index(6); // 可选:限制最多生成150列,超出部分截断 // Map(m => m.Result).Index(6).Length(150); } }
说明
- 固定字段共有6个,所以起始索引设为6,
Result的列会自动排在所有固定字段之后。 - CsvHelper处理
List<string>类型时,默认会生成Result1、Result2……格式的列头,每条记录的Result列表元素会依次填入对应列,长度不足的列自动留空。 - 如果要限制最多150个
Result列,加上.Length(150)即可,超出150条的Result元素会被忽略。
内容的提问来源于stack exchange,提问作者brummie49
相关产品推荐
相关产品推荐

