CSVHelper v2.0映射CSV时,如何为属性设置空字符串默认值
解决CSVHelper v2.0中空字段映射为空字符串的问题
问题场景
使用CSVHelper v2.0处理两类CSV文件:
- 旧文件无表头,通过索引映射到
Class1属性 - 新文件带表头,表头名称与
Class1属性名不一致,通过Class1Map构造函数的布尔参数区分处理
新CSV中IsEnable、CheckID字段始终为空,映射后IsEnable为NULL、CheckID为0,调用Default("")方法无法将其转为空字符串,需要实现空字段转空字符串的逻辑。
问题原因
CSVHelper v2.0中,Default()方法仅在目标字段不存在时生效;若字段存在但值为空,会使用对应数据类型的默认值:
- string类型默认值为
null - 数值类型(如int)默认值为
0
因此需要自定义转换逻辑处理空字段场景。
解决方案
方案1:字段级自定义转换(推荐)
在Class1Map中针对目标字段使用ConvertUsing方法,主动判断字段值是否为空,返回空字符串:
public Class1Map(bool IsNewCSV=false) { if (IsNewCSV) { Map(m => m.AccountId).Name("ACCOUNTREF"); Map(m => m.MeterId).Name("MeterREF"); // 处理IsEnable字段:空值转空字符串 Map(m => m.IsEnable).Name("IsEnable").ConvertUsing(row => string.IsNullOrWhiteSpace(row.GetField("IsEnable")) ? "" : row.GetField("IsEnable")); // 处理CheckID字段(string类型):空值转空字符串 Map(m => m.CheckID).ConvertUsing(row => string.IsNullOrWhiteSpace(row.GetField("CheckID")) ? "" : row.GetField("CheckID")); // 若CheckID为数值类型(如int),需转换为字符串后返回: // Map(m => m.CheckID).ConvertUsing(row => // string.IsNullOrWhiteSpace(row.GetField("CheckID")) ? "" : row.GetField<int>("CheckID").ToString()); } else { Map(m => m.AccountId).Index(0); Map(m => m.MeterId).Index(1); // 旧文件按索引处理空值 Map(m => m.IsEnable).Index(2).ConvertUsing(row => string.IsNullOrWhiteSpace(row.GetField(2)) ? "" : row.GetField(2)); Map(m => m.CheckId).Index(3).ConvertUsing(row => string.IsNullOrWhiteSpace(row.GetField(3)) ? "" : row.GetField(3)); } }
方案2:全局空值配置
如果需要对所有string类型字段统一处理空值转空字符串,可在CsvReader配置中设置:
using (CsvReader csvReader = new CsvReader(sr)) { sr = null; csvReader.Configuration.HasHeaderRecord = hasHeaderRecord; csvReader.Configuration.IgnoreBlankLines = false; csvReader.Configuration.IgnoreReadingExceptions = true; csvReader.Configuration.WillThrowOnMissingField = false; csvReader.Configuration.TrimFields = true; // 配置string类型空值处理:将空/Null值转为空字符串 var stringOptions = csvReader.Configuration.TypeConverterOptionsCache.GetOptions<string>(); stringOptions.NullValues = new[] { "", null }; stringOptions.Default = ""; csvReader.Configuration.RegisterClassMap<Class1Map>(); FileRecords = csvReader.GetRecords<Class1>().ToList(); }
此方案无需修改Class1Map的映射逻辑,会自动将所有string类型的空/Null字段值转为空字符串。
内容的提问来源于stack exchange,提问作者user768853
相关产品推荐
相关产品推荐

