Csv列并映射它们

时间:2016-07-15 03:02:40

标签: c# csv

假设我有一个包含以下内容的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是任意的。

这可能是什么解决方案?

谢谢,

1 个答案:

答案 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();
    }
}