使用CsvHelper v33解析含无效数据CSV并过滤错误行的方法
使用CsvHelper v33解析CSV并过滤无效数据行
针对你提供的CSV文件(包含Bob,x这条年龄无法转为整数的无效行),可以通过两种简洁方式实现解析并过滤无效数据:
方式一:捕获转换异常跳过无效行
先定义映射实体类,然后在读取时捕获转换异常来跳过无效行:
1. 定义实体类
public class Person { public string Name { get; set; } public int Age { get; set; } }
2. 解析并过滤
using CsvHelper; using CsvHelper.Configuration; using System.Globalization; using System.IO; using System.Collections.Generic; // 配置解析规则 var config = new CsvConfiguration(CultureInfo.InvariantCulture) { // 可根据需求自定义,比如禁用注释、设置分隔符等 }; using var reader = new StreamReader("your-csv-file.csv"); using var csv = new CsvReader(reader, config); var validPersons = new List<Person>(); csv.Read(); csv.ReadHeader(); while (csv.Read()) { try { // 尝试读取当前行到实体类 var person = csv.GetRecord<Person>(); validPersons.Add(person); } catch (CsvHelper.CsvHelperException) { // 捕获转换失败异常,跳过当前无效行 continue; } } // validPersons 仅包含 Jim 这条有效数据
方式二:可空类型+后置过滤
将Age字段设为可空整数类型,读取后直接过滤掉年龄为空的行,这种方式更简洁:
1. 修改实体类
public class Person { public string Name { get; set; } public int? Age { get; set; } }
2. 解析并过滤
using CsvHelper; using CsvHelper.Configuration; using System.Globalization; using System.IO; using System.Linq; var config = new CsvConfiguration(CultureInfo.InvariantCulture) { MissingFieldFound = null, // 忽略缺失字段的异常 BadDataFound = context => { // 可选:记录无效行日志 // Console.WriteLine($"无效行内容: {context.RawRecord}"); } }; using var reader = new StreamReader("your-csv-file.csv"); using var csv = new CsvReader(reader, config); // 读取所有记录后,过滤掉Age为空的行 var validPersons = csv.GetRecords<Person>() .Where(p => p.Age.HasValue) .ToList();
两种方式都适配CsvHelper v33版本,无需依赖过时API。
内容的提问来源于stack exchange,提问作者James McCormack
相关产品推荐
相关产品推荐

