CSVHelper设置列顺序

14

我正在使用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类,但是从文档中我无法弄清楚。我希望有像注释一样简单的东西可以应用于这个类,但我想不出来。

有人能帮帮我吗?

谢谢。


如何创建一个最小化、完整化和可验证的示例 https://stackoverflow.com/help/mcve - Dominic Jonas
我认为包含我的类并不相关,因为这是一个关于排序的问题。如果需要,我可以很愉快地包含它。 - Neil Walker
2个回答

19
请查看 CSVHelper 网站的映射部分 (http://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
谢谢,我读了那一部分但是没有完全理解,但是寄存器类映射将所有内容联系在一起,从v3中并不是很明显。谢谢。但是我认为注释会使它更简单和容易 :) - Neil Walker
3
我不得不使用 ClassMap<NodeDPCount> 而不是 CsvClassMap<NodeDPCount> - Kavo

9
你可以使用 Index 属性(CsvHelper.Configuration.Attributes.IndexAttribute, Assembly: CsvHelper) 来代替。点击这里了解更多信息。
public class Foo
{
    [Index(0)]
    public int Id { get; set; }

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接