Search code examples
c#csvhelper

CsvHelper add `;` after last value/column


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

Solution

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