使用CsvHelper写入CSV时如何按条件转换指定类成员值?
CsvHelper动态字段输出实现方案
该需求可以通过CsvHelper的自定义类映射(ClassMap)功能实现,你之前对Conversion方法仅支持读取的认知是有误的,CsvHelper的映射配置支持在写入时访问当前行的完整实例数据,可直接读取Updated字段做逻辑判断。
1. 创建自定义映射类
继承ClassMap<DataGroup>,在构造函数中为DataA、DataB配置自定义转换逻辑,通过转换参数获取当前行的完整DataGroup实例,读取Updated字段值决定输出内容。
using CsvHelper.Configuration; public class DataGroupMap : ClassMap<DataGroup> { public DataGroupMap() { // 自定义DataA输出逻辑 Map(m => m.DataA).Convert(args => { return args.Row.Updated ? args.Row.DataA : "N/A"; // 输出空字符串则替换为 return args.Row.Updated ? args.Row.DataA : string.Empty; }); // 自定义DataB输出逻辑 Map(m => m.DataB).Convert(args => { return args.Row.Updated ? args.Row.DataB : "N/A"; }); // 不需要输出Updated字段则添加.Ignore(),即 Map(m => m.Updated).Ignore(); Map(m => m.Updated); } }
2. 写入CSV时注册映射
初始化CsvWriter后注册自定义映射类,规则即可生效,完整写入示例如下:
using CsvHelper; using System.Globalization; using System.Collections.Generic; using System.IO; // 模拟测试数据 var dataList = new List<DataGroup> { new DataGroup { DataA = "测试值1", DataB = "测试值2", Updated = true }, new DataGroup { DataA = "测试值3", DataB = "测试值4", Updated = false } }; // 写入CSV文件 using (var writer = new StreamWriter("output.csv")) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csv.Context.RegisterClassMap<DataGroupMap>(); csv.WriteRecords(dataList); }
补充说明
如果使用的是v20之前的旧版CsvHelper,将Convert方法替换为旧版的ConvertUsing方法即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者wjax
相关产品推荐
相关产品推荐

