Как мне настроить CsvHelper, чтобы он всегда цитировал определенное поле в выходных данных CSV?

Я использую пакет CsvHelper для записи моих моделей C # в CSV. Я использую карты свободных классов (унаследованные от CsvClassMap), чтобы определить свое поле для сопоставлений свойств.

У меня проблема в том, что некоторые значения свойств выглядят как даты, на которые нужно обратить внимание. Например «2 - 4». Я ожидаю, что конечный пользователь будет использовать Excel для просмотра этих CSV-файлов. Я не хочу, чтобы эти значения отображались как даты, поэтому я хочу, чтобы CsvHelper заключил это поле в кавычки. Однако я хочу, чтобы ТОЛЬКО это поле было заключено в кавычки. Есть ДРУГИЕ поля, содержащие данные, которые Я ХОЧУ интерпретировать (например, даты). Могу ли я настроить свое сопоставление, чтобы указать, что это поле должно цитироваться? Я играл с преобразователем типов, но это явно неправильный подход, потому что он преобразует ЗНАЧЕНИЕ, а не инструктирует, как отформатировать поле.


person ChiralMichael    schedule 22.09.2015    source источник


Ответы (2)


Начиная с версии 12 вы можете сделать это:

const int indexToQuote = 4;
csv.Configuration.ShouldQuote = (field, context) => 
    context.Record.Count == indexToQuote && 
    context.HasHeaderBeenWritten;
person Lee Richardson    schedule 04.03.2019
comment
Я согласился, потому что это лучший конечный результат, но все равно не лучший. В идеале любое решение должно быть декларативным, а не императивным. Слишком стар для меня, чтобы вкладывать деньги в решение сейчас ;-) - person ChiralMichael; 23.03.2019
comment
Согласен, посредственное решение. Спасибо, что согласились, рад, что вы не из тех, кто стреляет в мессенджера :) - person Lee Richardson; 26.03.2019

Итак, очевидно, что цитирование - это не то, что мне нужно было делать. Excel весьма услужливо решает обрабатывать числовые значения, которые отдаленно похожи на даты, как даты, если только поле не начинается с пробела (который в этом случае не будет отображаться). Мне кажется, что полагаться на это довольно хакерски, но я возьму это. FWIW, вот преобразователь типов, который я использовал:

public class LeadingSpaceTypeConverter : DefaultTypeConverter {

    public override string ConvertToString( TypeConverterOptions options, object value ) {
        if (value == null ) {
            return String.Empty;
        }

        return String.Concat(" ", value.ToString());
    }
}

И беглый код:

Map( m => m.CompanySize ).TypeConverter<LeadingSpaceTypeConverter>().Index( 4 );
person ChiralMichael    schedule 22.09.2015