使用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
相关产品推荐
相关产品推荐

