使用 CSV Helper 库根据 CSV 是否具有相应的 header 动态创建 属性
Dynamically create property based on if CSV has corresponding header using CSV Helper library
使用 CSV Helper,我想知道是否有一种方法可以根据是否在我的 csv 文件中找到相应的列来动态创建 class 属性。
我正在处理的文件可能有也可能没有标题为 'ACTIVITY' 的列。如果在阅读它时,没有这样的专栏,有没有办法一起省略 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
objects.
的列表
using (var reader = new StreamReader("path\to\file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var records = csv.GetRecords<dynamic>();
}
否则,无法在常规 class 上动态创建 属性。您可以改为使用 2 种不同的 classes,一种带有 Activity
属性,一种不带 Activity
属性,然后根据 header.
加载正确的 class
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; }
}
使用 CSV Helper,我想知道是否有一种方法可以根据是否在我的 csv 文件中找到相应的列来动态创建 class 属性。
我正在处理的文件可能有也可能没有标题为 'ACTIVITY' 的列。如果在阅读它时,没有这样的专栏,有没有办法一起省略 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
objects.
using (var reader = new StreamReader("path\to\file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var records = csv.GetRecords<dynamic>();
}
否则,无法在常规 class 上动态创建 属性。您可以改为使用 2 种不同的 classes,一种带有 Activity
属性,一种不带 Activity
属性,然后根据 header.
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; }
}