CsvHelper读取CSV无需映射特定类型按行列索引取值方案
CsvHelper 无自定义映射按索引读取CSV方法
不需要手动编写列对应的映射类,直接用CsvHelper的底层Parser按索引逐字段取值,存成嵌套列表结构就能实现row[x][y]="markup"]的索引访问,全程不需要提前定义任何强类型。
- 核心思路:放弃CsvHelper默认的强类型绑定功能,直接调用Parser按列索引读取每个单元格的值,按「行列表嵌套列列表」的结构存储所有数据
- 实现代码:
using CsvHelper; using System.Globalization; using System.Collections.Generic; // 替换为你的CSV文件实际路径,配置项可根据文件实际分隔符、编码调整 using var streamReader = new StreamReader("target.csv"); using var csvReader = new CsvReader(streamReader, CultureInfo.InvariantCulture); // 外层集合对应所有行,内层集合对应单行的所有列,直接支持双索引访问 List<List<string>> result = new List<List<string>>(); // 如果你的CSV文件没有表头行,删除下面两行读取表头的代码即可 csvReader.Read(); csvReader.ReadHeader(); // 逐行遍历内容 while (csvReader.Read()) { var row = new List<string>(); // 遍历当前行所有列,按索引依次取值存入当前行集合 for (int col = 0; col < csvReader.Parser.Count; col++) { row.Add(csvReader.GetField(col)); } result.Add(row); }
- 访问方式:读取完成后直接通过索引取值即可,比如要访问第2行第3列(索引默认从0开始计数),直接调用
result[1][2]就能拿到对应单元格的字符串值,有类型转换需求的话可以在GetField时传入对应泛型参数,比如csvReader.GetField<int>(col)直接读取整型值。
注意:如果你的CSV文件存在空行、特殊转义字符,提前在CsvReader的配置项里开启对应的处理规则即可,整体存储和访问逻辑不需要改动。
内容的提问来源于stack exchange,提问作者user18408957
相关产品推荐
相关产品推荐

