为什么CsvHelper解析CSV时会将非空字符串识别为空并抛出异常?
问题根因
你遇到的报错本质不是日期格式解析错误,是列映射错位导致的:
CsvHelper默认配置下TrimHeaders = true,会自动移除表头字段的前后空格,你属性上标注的[Name(" A")]带有前导空格,和修剪后的表头A匹配失败,字段顺序错位后,原本对应D属性的2021-05-06日期列,实际匹配到了空的C列,所以抛出空文本转DateTime失败的错误,这也是为什么报错里Text: ''为空的原因,和日期格式本身无关,加[Format]特性自然不起作用。
解决方案
以下三种方案任选其一即可:
- 方案1:保留现有Name特性写法,修改配置禁用表头自动修剪
var reader = new CsvReader(myStreamReader, new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = ";", MissingFieldFound = null, TrimHeaders = false // 禁用表头空格修剪,直接匹配带前导空格的列名 });
- 方案2:保留默认配置,修改Name特性移除前导空格
把所有属性的[Name]特性里的前导空格去掉,例如:
[Name("A")] // 去掉前面的空格 public string a { get; set; }
其余列同理修改即可。
- 方案3:更鲁棒的通用处理方案(推荐)
通过PrepareHeaderForMatch配置统一处理表头,不管表头有多少前后空格都能正常匹配,不用修改现有特性或者依赖Trim配置:
var reader = new CsvReader(myStreamReader, new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = ";", MissingFieldFound = null, PrepareHeaderForMatch = args => args.Header.Trim() // 统一修剪表头前后空格后再匹配 });
对应属性的[Name]特性直接写不带空格的列名即可。
内容的提问来源于stack exchange,提问作者Pine Code
相关产品推荐
相关产品推荐

