C#自动化读取CSV文件触发CSV Helper:Bad Data Exception异常如何解决
C#使用CsvHelper读取CSV触发Bad Data Exception及变量返回null问题解决方案
问题背景:编写C#自动化代码时仅使用单个CSV文件读取数据,仅在读取部分特定值时触发
CsvHelper:Bad Data Exception异常,本应赋值为Xpath的strIdentifierType变量返回值为null,代码逻辑、CSV文件指向均未修改,开发环境为Visual Studio 2019。
核心排查及解决方案
- CSV文件隐藏格式/特殊字符问题
触发异常的对应行字段大概率包含引号、换行符、逗号这类CsvHelper默认的分隔/转义相关特殊字符,也可能是CSV保存时带了BOM编码、存在不可见的零宽空格/制表符。可先用纯文本编辑器打开异常行对应字段排查,同时修改CsvHelper配置兼容特殊字符:
配置示例代码:var config = new CsvConfiguration(CultureInfo.InvariantCulture) { AllowComments = false, BadDataFound = null, // 忽略坏数据错误,也可自定义处理逻辑 Delimiter = ",", Mode = CsvMode.RFC4180, TrimOptions = TrimOptions.Trim }; using (var reader = new StreamReader("你的CSV文件路径")) using (var csv = new CsvReader(reader, config)) { // 原有读取逻辑 } - 列名映射不匹配问题
检查CSV文件中对应strIdentifierType的列名是否有多余空格、大小写差异,或者部分行该列本身为空值。可通过手动指定字段映射避免自动映射失败返回null:
映射示例代码:public sealed class CsvMap : ClassMap<你的数据实体类名> { public CsvMap() { Map(m => m.strIdentifierType).Name("CSV文件中对应列的实际名称"); } } // 读取前注册映射规则 csv.Context.RegisterClassMap<CsvMap>(); - 异常捕获逻辑导致的赋值失败问题
部分行读取触发BadDataException后,如果现有异常捕获逻辑直接跳过了字段赋值步骤,也会导致变量拿到null。可在配置中添加日志输出定位异常行:
日志配置示例:BadDataFound = context => { Debug.WriteLine($"坏数据行号:{context.Context.Parser.Row}, 原始内容:{context.RawRecord}"); }
内容的提问来源于stack exchange,提问作者Sindhu Sivaraman
相关产品推荐
相关产品推荐

