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

使用File Helper库解析含逗号字段的CSV时出错的解决请求

解决FileHelpers解析含逗号的引号包裹CSV字段问题

在.NET Core项目中使用FileHelpers解析CSV时,遇到MemberName字段值"Newmon, Osborn"因包含逗号且被引号包裹,导致解析错误的问题。相关代码及CSV内容如下:

原CSV内容

Branch,ANumber,Type,PNumber,CustNumber,Reference,MemberName,Code,IncidentDate
XYZ,15555,New,4545454545,8998-42454-1215,S454545/112,"Newmon, Osborn",GGG SHF,28/01/2022

原实体类定义

[DelimitedRecord(",")]
[IgnoreEmptyLines]
public class ABC
{
    [FieldNullValue(typeof(string), "")]
    public string Branch{ get; set; }
    [FieldNullValue(typeof(string), "")]
    public string ANumber{ get; set; }
    [FieldNullValue(typeof(string), "")]
    public string Type{ get; set; }
    [FieldNullValue(typeof(string), "")]
    public string PNumber{ get; set; }
    [FieldNullValue(typeof(string), "")]
    public string CustNumber{ get; set; }
    [FieldNullValue(typeof(string), "")]
    public string Reference{ get; set; }
    [FieldNullValue(typeof(string), "")]
    public string MemberName{ get; set; }
    [FieldNullValue(typeof(string), "")]
    public string Code{ get; set; }
    [FieldNullValue(typeof(DateTime), "1900-01-01"), FieldConverter(ConverterKind.DateMultiFormat, "dd/MM/yyyy", "yyyy-MM-dd", "MM/dd/yyyy")]
    public DateTime IncidentDate{ get; set; }
}

问题原因

默认的[DelimitedRecord(",")]仅以逗号作为字段分隔符,不会识别双引号作为字段的包裹标记。因此"Newmon, Osborn"会被拆分为"Newmon和 Osborn"两个字段,导致字段数量不匹配,解析失败。

解决方案

在MemberName字段上添加[FieldQuoted]特性,指定引号字符为双引号,并设置引用模式为可选(适配字段是否被引号包裹的情况)。修改后的实体类如下:

[DelimitedRecord(",")]
[IgnoreEmptyLines]
public class ABC
{
    [FieldNullValue(typeof(string), "")]
    public string Branch{ get; set; }
    [FieldNullValue(typeof(string), "")]
    public string ANumber{ get; set; }
    [FieldNullValue(typeof(string), "")]
    public string Type{ get; set; }
    [FieldNullValue(typeof(string), "")]
    public string PNumber{ get; set; }
    [FieldNullValue(typeof(string), "")]
    public string CustNumber{ get; set; }
    [FieldNullValue(typeof(string), "")]
    public string Reference{ get; set; }
    [FieldNullValue(typeof(string), "")]
    [FieldQuoted('"', QuoteMode.OptionalForBoth)] // 添加该特性处理引号包裹
    public string MemberName{ get; set; }
    [FieldNullValue(typeof(string), "")]
    public string Code{ get; set; }
    [FieldNullValue(typeof(DateTime), "1900-01-01"), FieldConverter(ConverterKind.DateMultiFormat, "dd/MM/yyyy", "yyyy-MM-dd", "MM/dd/yyyy")]
    public DateTime IncidentDate{ get; set; }
}

特性参数说明

  • '"':指定包裹字段的引号字符为双引号。
  • QuoteMode.OptionalForBoth:表示字段既可以被引号包裹,也可以不被包裹,适配CSV中不同字段的格式。

额外注意

测试代码中的Assert.Equal("899-42-12154",data.CustNumber);与CSV中的8998-42454-1215不匹配,建议修正断言值以保证测试通过。

内容的提问来源于stack exchange,提问作者varun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:35:29