CsvHelper add `;` after last value/column

Viewed 281

Is there any configuration or something that will let me add ; after last value?

FirstName;SecondName
A;B

I need it to be

FirstName;SecondName;
A;B;

Here's my code:

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);
}

Thanks in advance

edit. Map Class

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");
    }
}
1 Answers

First solution - loop:

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();
    }
}

Second solution - hack, creating new property:

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);
    }
}
Related