首页 > 解决方案 > CSV 助手,忽略空值

问题描述

我正在使用 CSVHelper 读取 csv 文件的类型:

1.

6000000,1,2020
6000001,1,2020
6000002,1,2020
6000003,1,2020
6000004,1,2020
6000000
6000001
6000002

这是我的模型:

public class Body
    {
        public long Id { get; set; }

        public int Semester { get; set; }

        public int Year { get; set; }
    }

该模型适用于第一种类型的文件。但在第二次的情况下,它会引发异常。我认为这是因为 CSV 中没有学期和年份的字段。有没有办法在读取第二个文件中不存在的时候忽略这两个附加字段?我不想创建仅具有 Id 属性的其他模型。

我读取 csv 的方法:

public List<T> ReadFile<T>(StreamReader stream)
        {
            using (var csv = new CsvReader(stream, CultureInfo.InvariantCulture))
            {
                csv.Configuration.HasHeaderRecord = false;
                var records = csv.GetRecords<T>().ToList();
                return records;
            }
        }

因此,如果我要读取第二个文件,那么将返回带有 Body 对象的 List 但 Semester 和 Year 属性将为空或 0

标签: c#.netcsvparsingcsvhelper

解决方案


OptionalAttribute:来自 CSVHelper 文档:“如果找不到匹配的字段名称,则在读取时忽略该成员。”

只需像这样标记您的模型:

public class Body
    {
        public long Id { get; set; }
        [Optional]
        public int Semester { get; set; }
        [Optional]
        public int Year { get; set; }
    }

或使用ClassMap

public class BodyMap : ClassMap<Body>
{
    public BodyMap()
    {
        Map(m => m.Id);
        Map(m => m.Semester).Optional();
        Map(m => m.Year).Optional();
    }
}

然后添加以下内容:

csv.Configuration.RegisterClassMap(new BodyMap());


推荐阅读