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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 13:12:35