【问题标题】:CSV Helper, Ignore empty ValuesCSV 助手,忽略空值
【发布时间】:2020-07-10 13:08:50
【问题描述】:

我正在使用 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# .net csv parsing csvhelper


【解决方案1】:

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());

【讨论】:

  • 好的,谢谢,看起来它适用于 Optional,但我必须将 Semester 和 Year 设置为字符串,因为使用 int 类型时我遇到了异常
  • 我相信您也可以使用可为空的 int public int? Semester
  • 正如 David Specht 所说 - 将它们更改为可为空的整数也应该解决该问题!道歉 - 忽略了那个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2019-04-30
  • 1970-01-01
相关资源
最近更新 更多