c# - 使用 CSV Helper 库根据 CSV 是否具有相应的标题动态创建属性
问题描述
使用 CSV Helper,我想知道是否有一种方法可以根据我的 csv 文件中是否找到相应的列来动态创建类属性。
我正在使用的文件可能有也可能没有标题为“活动”的列。如果在阅读时,没有这样的列,有没有办法一起省略 Activity 属性的创建?
// csv properties
public class Pr530CsvHandler
{
public string Company { get; set; }
public string Name { get; set; }
// other expected properties...
public string Activity { get; set; } //<-- don't create if there is no corresponding column in CSV
}
// map
public sealed class Pr530Map : ClassMap<Pr530CsvHandler>
{
public Pr530Map()
{
Map(m => m.Company).Name("COMPANY").Optional();
Map(m => m.Name).Name("NAME").Optional();
// other mapped headers...
Map(m => m.Activity).Name("ACTIVITY").Optional(); // this one may not exist in CSV
}
}
解决方案
你可以得到一个dynamic
对象列表。
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var records = csv.GetRecords<dynamic>();
}
否则,没有办法在常规类上动态创建属性。相反,您可以有 2 个不同的类,一个有属性,一个没有Activity
属性,并根据标题加载正确的类。
void Main()
{
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
csv.Context.RegisterClassMap<Pr530ActivityMap>();
csv.Context.RegisterClassMap<Pr530Map>();
csv.Read();
csv.ReadHeader();
if (csv.HeaderRecord.Contains("ACTIVITY"))
{
var records = csv.GetRecords<Pr530ActivityCsvHandler>();
}
else
{
var records = csv.GetRecords<Pr530CsvHandler>();
}
}
}
public sealed class Pr530Map : ClassMap<Pr530CsvHandler>
{
public Pr530Map()
{
Map(m => m.Company).Name("COMPANY").Optional();
Map(m => m.Name).Name("NAME").Optional();
// other mapped headers...
}
}
public sealed class Pr530ActivityMap : ClassMap<Pr530ActivityCsvHandler>
{
public Pr530ActivityMap()
{
Map(m => m.Company).Name("COMPANY").Optional();
Map(m => m.Name).Name("NAME").Optional();
// other mapped headers...
Map(m => m.Activity).Name("ACTIVITY").Optional();
}
}
public class Pr530ActivityCsvHandler
{
public string Company { get; set; }
public string Name { get; set; }
public string Activity { get; set; }
}
public class Pr530CsvHandler
{
public string Company { get; set; }
public string Name { get; set; }
}
推荐阅读
- python - 如何在 Python 中从 pandas 数据帧生成分层 JSON 树
- java - 有没有办法在 Java 中获取另一个正在运行的应用程序的输出
- node.js - 为什么我在本机反应中总是收到“网络请求失败”错误?
- java - 在 Leetcode 中计数 Nice Pairs 给了我错误的结果
- python - 使用 utf8mb4 字符集的 mysql.connector 中的 executemany 方法不起作用(python)
- java - 如何在java中检查电子邮件地址
- encoding - 任何缩短字符串的编码解码方法
- python - 从 .csv 文件中读取每个字符串
- java - 我可以将这两者合二为一吗?
- c++ - 删除动态分配的类数组