C# CsvHelper添加`;`在最后一个值/列之后

C# CsvHelper添加`;`在最后一个值/列之后,c#,csvhelper,C#,Csvhelper,是否有任何配置或东西可以让我添加在最后一个值之后 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(Culture

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

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);
}
使用(TextWriter writer=newstreamwriter(fd.FileName,false,System.Text.Encoding.UTF8))
{
var csv=新CsvWriter(编写器,新csv配置(CultureInfo.InvariantCulture)
{
分隔符=“;”,
});
csv.Configuration.RegisterClassMap();
csv.WriterRecords(_行);
}
提前谢谢

编辑。地图类

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:ClassMap
{
公共DataRowClassMap()
{
Map(m=>m.ListingNumber).Ignore();
Map(m=>m.FirstName).Index(0.Name)(“FirstName”);
Map(m=>m.LastName).Index(1.Name)(“LastName”);
}
}
第一个解决方案-循环:

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();
    }
}
使用(TextWriter writer=newstreamwriter(fd.FileName,false,System.Text.Encoding.UTF8))
{
var csv=新CsvWriter(编写器,新csv配置(CultureInfo.InvariantCulture)
{
分隔符=“;”,
});
csv.Configuration.RegisterClassMap();
csv.WriteHeader();//写入头
csv.WriteField(“”;//它将在文件中为“;”
csv.NextRecord();
foreach(行中的var项)
{
csv.WriteRecord(项目);//实际数据
csv.WriteField(“”;//它将在文件中为“;”
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);
    }
}
公共密封类DataRowClassMap:ClassMap
{
公共DataRowClassMap()
{
Map(m=>m.ListingNumber).Ignore();
Map(m=>m.FirstName).Index(0.Name)(“FirstName”);
Map(m=>m.LastName).Index(1.Name)(“LastName”);
//解决方案黑客
Func Func=x=>“”;
Map(x=>x.HackForCommaAfterLastColumn).Index(3).Name(“”).ConvertUsing(func);
}
}

是否有一个名称为空的伪空属性?顺便说一句,您可以共享DataRowClassMap。您可以在映射中指定列索引,因此它始终是最后一个。@DragandDrop哈哈,是的,我刚带了它,但这是一个非常丑陋的黑客行为
Func=x=>“”;Map(x=>x.HackForCommaAfterLastColumn).Index(29).Name(“”).ConvertUsing(func)
另一个选项可能是不使用
WriteRecords
,而是使用不带s的
foreach
+
WriteRecords
WriteField
来添加“;”写入字段后缺少csv.nextRecord()。它应该会起作用。大脑编译器告诉我有什么不对劲。但是如果没有合适的电子数据交换,你就不知道该怎么办。你应该把答案放在答案框里,而不是问题本身。请随意回答您自己的问题。我不会因为我们的那些小暗示和头脑风暴而叫停。