【问题标题】:Setting column order for CSVHelper设置 CSVHelper 的列顺序
【发布时间】:2018-08-15 14:13:53
【问题描述】:

我正在使用 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、姓名、年龄等字段。

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

我相信我必须使用 Mapping 类,但从文档中我无法弄清楚。我希望有一些简单的东西,比如类的注释,但我想不是。

谁能帮忙?

谢谢。

【问题讨论】:

  • 如何创建一个最小、完整和可验证的示例stackoverflow.com/help/mcve
  • 我认为包含我的课程无关紧要,因为这是关于订购的问题。我可以很高兴地包含它。

标签: c# csvhelper


【解决方案1】:

查看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类交互时使用你注册的地图

【讨论】:

  • 谢谢,我读了那段内容,但不太明白,但是寄存器类映射将它们联系在一起,从 v3 开始,这并不是很明显。谢谢。但我认为注释会让它变得更简单和容易:)
  • 我不得不使用ClassMap&lt;NodeDPCount&gt; 而不是CsvClassMap&lt;NodeDPCount&gt;
【解决方案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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多