设置CSVHelper的列顺序

时间:2018-03-07 12:57:37

标签: c# csvhelper

我正在使用CSVMapper输出字典中的对象:

        using (TextWriter writer = new StreamWriter($"somefile.csv"))
        {
            var csvDP = new CsvWriter(writer);
            csvDP.WriteHeader<NodeDPCount>();
            csvDP.NextRecord();
            foreach (NodeDPCount dpItem in dp.Values)
            {
                csvDP.WriteRecord(dpItem);
                csvDP.NextRecord();
            }
        }

这是一个简单的类,包含ID,Name,Age等字段。

然而,列的输出是我不喜欢的顺序(例如ID不是第一个),我想指定哪个列是第一个,第二个等等。

我相信我必须使用Mapping类,但是从文档中我无法弄明白。我希望像课堂上的注释那样简单,但我猜不是。

有人可以帮忙吗?

感谢。

2 个答案:

答案 0 :(得分:10)

请查看CSVHelperhttp://joshclose.github.io/CsvHelper/2.x/)网站的“映射”部分

具体做法是:

  

按索引映射时,指定要用于该属性的CSV列的索引

因此,您必须为NodeDPCount类指定一个映射类,告诉它使用哪个索引作为哪些记录。

public sealed class MyNodeDPCountMap : CsvClassMap<NodeDPCount>
{
    public MyNodeDPCountMap()
    {
        Map( m => m.Id ).Index( 0 );
        Map( m => m.Name ).Index( 1 );
        // etc.
    }
}

为此,您需要注册地图:

csv.Configuration.RegisterClassMap<MyNodeDPCountMap>();

然后它会知道使用您在与NodeDPCount班级互动时注册的地图

答案 1 :(得分:2)

你可以只使用索引属性(CsvHelper.Configuration.Attributes.IndexAttribute,Assembly: CsvHelper)。 here

public class Foo
{
    [Index(0)]
    public int Id { get; set; }

    [Index(1)]
    public string Name { get; set; }
}