You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:27:03