Запись цитат в определенные поля CSV с помощью CsvHelper

При записи файла CSV необходимо указывать только определенные столбцы. Используя CsvHelper 6.1.0, есть ли способ индивидуальной настройки полей, в частности, цитируются ли они?

Поле1, Поле2, Поле3, Поле4, Поле5, Поле6 «В кавычках», «В кавычках», NotQuoted, NotQuoted, NotQuoted, «В кавычках» «В кавычках», «В кавычках», NotQuoted, NotQuoted, NotQuoted, «Quoted»

Пока что я нашел только в объекте конфигурации QuoteAllFields и QuoteNoFields.


person disassemble-number-5    schedule 24.12.2017    source источник
comment
Почему вы используете CsvHelper для написания очень простого CSV-файла? Лучше писать с помощью класса StreamWriter. Вы можете создать строку csv, используя string outputline = string.Join (, new string [] {colA, colB, colC, colD}); Writer.Writeline (строка вывода);   -  person jdweng    schedule 24.12.2017
comment
@jdweng выполняется еще немного работы, которую не нужно показывать. Просто нужно узнать, можно ли и как настраивать расценки для каждого поля.   -  person disassemble-number-5    schedule 24.12.2017
comment
Не знаю, подойдет ли вам CSVHelper. Очень просто с методами сетевой библиотеки.   -  person jdweng    schedule 24.12.2017


Ответы (2)


Это можно сделать с помощью сопоставления классов.

Вы можете начать с автоматического сопоставления класса, а затем отредактировать поля, которые должны быть заключены в кавычки. Что-то вроде этого:

public sealed class MyClassMap : ClassMap<MyClass> {
    public MyClassMap() {
        AutoMap();
        Map(m => m.Field1).ConvertUsing(m => $"\"{m.Field1}\"");
        Map(m => m.Field2).ConvertUsing(m => $"\"{m.Field2}\"");
        Map(m => m.Field6).ConvertUsing(m => $"\"{m.Field6}\"");
    }
}

Затем вы применяете его, когда пишете файл следующим образом:

CsvWriter myWriter = new CsvWriter(stream);
myWriter.Configuration.RegisterClassMap<MyClassMap>();

Я не совсем уверен, что это «правильный» способ сделать это, но он определенно кажется самым простым. Вы могли бы реализовать TypeConverter, который помещает в кавычки, но это кажется слишком большим трудом для чего-то настолько простого ...

person Lauraducky    schedule 09.01.2018
comment
Это решение вставляло для меня слишком много цитат. Чтобы исправить это, мне пришлось csv.Configuration.QuoteNoFields = true;, но это испортило мои другие строковые поля: | - person Lee Richardson; 04.03.2019

Я знаю, что OP спрашивал о 6.1.0, но в случае, если это помогает другим, для версии 12 есть лучшее решение:

var indexesToQuote = new[] { 0, 2 };
csv.Configuration.ShouldQuote = (field, context) => 
    indexesToQuote.Contains(context.Record.Count) && 
    context.HasHeaderBeenWritten;
person Lee Richardson    schedule 04.03.2019