CsvHelper add `;` после последнего значения / столбца

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

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

person Joelty    schedule 26.03.2020    source источник
comment
У вас есть фиктивное пустое свойство с пустым именем? Можете ли вы поделиться DataRowClassMap, кстати. Вы можете указать индекс столбца на карте, чтобы он всегда был последним.   -  person Drag and Drop    schedule 26.03.2020
comment
@DragandDrop ха-ха, да, я только что пришел с ним, но это чертовски уродливый хак Func<DataRow, string> func = x => ""; Map(x => x.HackForCommaAfterLastColumn).Index(29).Name("").ConvertUsing(func);   -  person Joelty    schedule 26.03.2020
comment
другой вариант может заключаться в том, чтобы не использовать WriteRecords, а foreach + WriteRecord без s и WriteField для добавления ';'   -  person Drag and Drop    schedule 26.03.2020
comment
@DragandDrop Ага, дилемма ленивого + хака против не ленивого;) Ты это имел в виду? foreach (var item in _rows){csv.WriteRecord(item);csv.WriteField(";");} почему то выдает пустой файл, хм ...   -  person Joelty    schedule 26.03.2020
comment
Отсутствует csv.NextReccord () после поля записи. и он должен работать. Компилятор мозга сообщает мне, что что-то не так. Но не могу понять, что без надлежащего edi.   -  person Drag and Drop    schedule 26.03.2020
comment
Кстати, вместо того, чтобы писать ";", нам нужно написать "", потому что ; будет экранирован в ";". В любом случае, спасибо, напишите, пожалуйста, это как ответ, и я приму. Мой код находится в основном посте   -  person Joelty    schedule 26.03.2020
comment
Вы должны указать ответ в поле для ответа, а не в вопросе. Не стесняйтесь отвечать на свой вопрос. Я не собираюсь отказываться от тех маленьких намеков и мозговых штурмов, которые у нас были.   -  person Drag and Drop    schedule 26.03.2020


Ответы (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);
    }
}
person Joelty    schedule 26.03.2020