CsvHelper add `;` после последнего значения / столбца - PullRequest
1 голос
/ 26 марта 2020

Есть ли какая-либо конфигурация или что-то, что позволит мне добавить ; после последнего значения?

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

1 Ответ

1 голос
/ 26 марта 2020

Первое решение - l oop:

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