使用CsvHelper解析CSV时出现decimal类型转换失败错误怎么解决?
问题根因
从报错信息可以定位到两个核心问题:
- 索引18对应的
LensBespokePrice字段在CSV行中是空值,你定义的实体类中该字段为不可空decimal类型,默认转换器无法将空字符串转换为decimal值 CareOnly字段仅配置了[BooleanTrueValues("Y")],未配置空值/非Y值的转换规则,该字段在CSV中同样为空,也会触发转换失败
另外你提到的GetRecords不报错、遍历才报错是正常现象:CsvHelper的GetRecords返回的是延迟迭代器,只有遍历的时候才会真正执行行解析和类型转换逻辑。
解决方案
方案1:修改实体类适配空值(推荐)
将可能为空的值类型改为可空类型,同时补全布尔值的转换规则:
public class Payer { // 其他属性保持不变 public decimal? LensBespokePrice { get; set; } // 改为可空decimal [BooleanTrueValues("Y")] [BooleanFalseValues("N", "")] // 把空字符串加入false匹配规则 public bool? CareOnly { get; set; } // 如果要求空值必须返回false,可保留bool类型不用改可空 }
方案2:全局配置CsvHelper处理空值(无需修改实体类)
如果不想调整实体类定义,可以在初始化CsvConfiguration时添加全局转换规则:
static void Main(string[] args) { var culture = new CultureInfo("en-GB"); var config = new CsvHelper.Configuration.CsvConfiguration(culture) { // 空字符串自动转null ConvertEmptyStringToNull = true, // 缺失字段不抛错 MissingFieldFound = null }; // 单独配置decimal类型空值默认返回0 config.TypeConverterOptionsCache.GetOptions<decimal>().Default = 0m; // 单独配置bool类型空值默认返回false config.TypeConverterOptionsCache.GetOptions<bool>().Default = false; using (var reader = new StreamReader("test.csv")) using (var csv = new CsvReader(reader, config)) { var records = csv.GetRecords<Payer>().ToList(); // 可以加ToList直接触发解析,避免后续遍历再抛错 foreach (var payer in records) { Console.WriteLine(payer); } } }
两种方案任选其一即可解决转换报错问题。
内容的提问来源于stack exchange,提问作者user2792697
相关产品推荐
相关产品推荐

