CsvHelper类型转换:将含字符串与数值的Id列映射为int类型
实现方案
方案说明
CsvHelper支持通过Convert/ConvertUsing方法自定义字段映射转换逻辑,你可以直接在MyClassMap的Id字段映射规则里加入自定义转换逻辑即可。
完整代码实现
映射类实现(适配CsvHelper v27+ 新版本)
public class MyClassMap : CsvHelper.Configuration.ClassMap<MyClass> { public MyClassMap() { Map(m => m.Id).Name("Id").Convert(args => { // 读取Id列原始字符串值 string rawId = args.Row.GetField<string>("Id"); // 按自定义规则转换 return rawId switch { "Team1Id" => -1, "Team2Id" => -2, // 其他值尝试转为int,转换失败可根据需求调整异常处理逻辑 _ => int.TryParse(rawId, out int numId) ? numId : throw new NotSupportedException($"未适配的Id值:{rawId}") }; }); Map(m => m.Name).Name("Name"); } }
旧版本CsvHelper(v20及以下)适配写法
如果你的项目用的是低版本CsvHelper,替换为ConvertUsing方法即可:
public class MyClassMap : CsvHelper.Configuration.ClassMap<MyClass> { public MyClassMap() { Map(m => m.Id).Name("Id").ConvertUsing(row => { string rawId = row.GetField<string>("Id"); return rawId switch { "Team1Id" => -1, "Team2Id" => -2, _ => int.Parse(rawId) }; }); Map(m => m.Name).Name("Name"); } }
CSV读取示例
读取CSV时需要注册你写的映射类:
// 引入命名空间 using CsvHelper; using System.Globalization; using System.IO; // 读取逻辑 var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true, TrimEntries = true // 自动去掉字段前后的空格 }; using var streamReader = new StreamReader("你的测试文件路径.csv"); using var csvReader = new CsvReader(streamReader, csvConfig); // 注册自定义映射 csvReader.Context.RegisterClassMap<MyClassMap>(); // 读取所有记录 var result = csvReader.GetRecords<MyClass>().ToList();
效果验证
你提供的测试CSV读取后的结果如下:
- 第一条:Id=10,Name=Foo
- 第二条:Id=-1,Name=Joe
- 第三条:Id=-1,Name=Blogs
- 第四条:Id=-2,Name=Foo Bar
内容的提问来源于stack exchange,提问作者markD
相关产品推荐
相关产品推荐

