【问题标题】:CsvHelper add `;` after last value/columnCsvHelper 在最后一个值/列之后添加 `;`
【发布时间】:2020-03-26 18:39:25
【问题描述】:

是否有任何配置或什么可以让我在最后一个值之后添加;

FirstName;SecondName
A;B

我需要它

FirstName;SecondName;
A;B;

这是我的代码:

using (TextWriter writer = new StreamWriter(fd.FileName, false, System.Text.Encoding.UTF8))
{
    var csv = new CsvWriter(writer, new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        Delimiter = ";",
    });

    csv.Configuration.RegisterClassMap<DataRowClassMap>();
    csv.WriteRecords(_rows);
}

提前致谢

编辑。地图类

public sealed class DataRowClassMap : ClassMap<DataRow>
{
    public DataRowClassMap()
    {
        Map(m => m.ListingNumber).Ignore();
        Map(m => m.FirstName).Index(0).Name("FirstName");
        Map(m => m.LastName).Index(1).Name("LastName");
    }
}

【问题讨论】:

  • 有一个空名称的虚拟空属性?顺便说一句,您可以分享 DataRowClassMap。您可以在地图中指定列索引,因此它始终是最后一个。
  • @DragandDrop 哈哈,是的,我刚来了,但它太丑了Func&lt;DataRow, string&gt; func = x =&gt; ""; Map(x =&gt; x.HackForCommaAfterLastColumn).Index(29).Name("").ConvertUsing(func);
  • 另一种选择可能是不使用WriteRecords,而是使用foreach + WriteRecord 不带s 和WriteField 来添加';'
  • 在写入字段后缺少 csv.NextReccord()。它应该可以工作。大脑编译器告诉我有什么不对劲。但是如果没有适当的 edi,就无法弄清楚会发生什么。
  • 您应该将答案放在答案框中,而不是放在问题本身中。随意回答你自己的问题。我不会因为我们的那些小提示和头脑风暴而感到沮丧。

标签: c# csvhelper


【解决方案1】:

第一个解决方案 - 循环:

using (TextWriter writer = new StreamWriter(fd.FileName, false, System.Text.Encoding.UTF8))
{
    var csv = new CsvWriter(writer, new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        Delimiter = ";",
    });

    csv.Configuration.RegisterClassMap<DataRowClassMap>();

    csv.WriteHeader<DataRow>(); // write headers
    csv.WriteField(""); // it will be `;` in file
    csv.NextRecord();

    foreach (var item in _rows)
    {
        csv.WriteRecord(item); // actual data 
        csv.WriteField(""); // it will be `;` in file
        csv.NextRecord();
    }
}

第二种解决方案 - 破解,创建新属性:

public sealed class DataRowClassMap : ClassMap<DataRow>
{
    public DataRowClassMap()
    {
        Map(m => m.ListingNumber).Ignore();
        Map(m => m.FirstName).Index(0).Name("FirstName");
        Map(m => m.LastName).Index(1).Name("LastName");

        // solution hack
        Func<DataRow, string> func = x => "";
        Map(x => x.HackForCommaAfterLastColumn).Index(3).Name("").ConvertUsing(func);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多