假设我有一个包含以下内容的csv文件:
Column1,Column2,Column3
Supermario,1989,Nintendo
但是我想静态定义有效的列标题,例如:
Game_Name,Year,Console_Name
我想允许用户将csv中的标头映射到静态有效标头,如下所示:
Column1 ---- Game_Name
Column2 ---- Year
Column3 ----- Console_Name
我无法弄清楚如何完成这项任务。
之前我曾使用csvhelper
来读取csv文件,但在这里我想让用户定义自己的列标题,当我的表单应用程序运行时,我想将它们映射到有效的列标题。
在Jeff提到的片段的以下部分中:
public MyDataClassMap()
{
Map(x => x.GameName).Name("Column1");
Map(x => x.Year).Name("Column2");
Map(x => x.ConsoleName).Name("Column3");
}
这里看起来像#34; Column1"其余的都是动态地映射而不是动态映射...我不知道列将被命名为什么,那么它将如何工作?如果这些列总是被命名为Column1,Column2等,那么这将有效,但有时它的Column1有时它的Col1有时它的C1是任意的。
这可能是什么解决方案?
谢谢,
答案 0 :(得分:0)
使用CsvHelper,为您的数据类型创建一个类映射,注册它,然后将其读入。
class MyData
{
public string GameName { get; set; }
public string Year { get; set; }
public string ConsoleName { get; set; }
}
class MyDataClassMap : CsvClassMap<MyData>
{
public MyDataClassMap()
{
Map(x => x.GameName).Name("Column1");
Map(x => x.Year).Name("Column2");
Map(x => x.ConsoleName).Name("Column3");
}
}
public List<MyData> ReadMyData(string path)
{
using (var file = File.OpenText(path))
using (var reader = new CsvReader(file))
{
reader.Configuration.RegisterClassMap<MyDataClassMap>();
return reader.GetRecords<MyData>().ToList();
}
}
如果您知道标题的名称可能会更改但列顺序没有更改,则可以按索引映射它们。
public MyDataClassMap()
{
Map(x => x.GameName).Index(0);
Map(x => x.Year).Index(1);
Map(x => x.ConsoleName).Index(2);
}
否则,您可以向构造函数添加参数,以便提供列的名称,然后实例化地图。
public MyDataClassMap(string gameNameCol, string yearCol, string consoleNameCol)
{
Map(x => x.GameName).Name(gameNameCol);
Map(x => x.Year).Name(yearCol);
Map(x => x.ConsoleName).Name(consoleNameCol);
}
public List<MyData> ReadMyData(string path,
string gameNameCol, string yearCol, string consoleNameCol)
{
using (var file = File.OpenText(path))
using (var reader = new CsvReader(file))
{
reader.Configuration.RegisterClassMap(
new MyDataClassMap(gameNameCol, yearCol, consoleNameCol));
return reader.GetRecords<MyData>().ToList();
}
}