c# - 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
解决方案
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());
推荐阅读
- java - 为什么 Primefaces commandButton 不重定向到页面?
- c++11 - std::chrono::milliseconds .count() 以微秒为单位返回?
- hyperledger-fabric - 如果一个同行宕机了怎么办
- php - Laravel 5.7 AJAX POST 请求已取消
- java - Java 从文件中读取。结果不好
- python - 过滤来自 many2one 字段的值
- laravel - Laravel / AsgardCMS 验证复杂/复合实体
- ios - 如何在 Twilio 的可编程聊天中将 ${USER_FRIENDLY_NAME} 显示为标题并将 ${MESSAGE} 显示为推送通知有效负载的正文?
- java - Java:无法获取文件的绝对路径
- sql-server - 如何优化此 SQL Server 查询