Библиотека FileHelpers. Можно ли изменить формат даты поля во время выполнения?

Использование библиотеки FileHelpers версии 3.0.1.

Скажем, вы определяете поле для импорта из CSV-файла следующим образом:

    [FieldTrim(TrimMode.Both)] 
    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
    [FieldConverter(ConverterKind.Date, "d-MMMM-yyyy")]
    public DateTime DOB;

Теперь ожидается, что поле csv будет иметь формат даты «d-MMMM-yyyy» и будет установлено во время компиляции. У меня есть требование во время выполнения (иногда) изменить этот формат на «d-MMMM-yy».

Используемый формат зависит от исходного файла — в некоторых файлах год указывается из 2 цифр, в других — из 4 цифр. Я буду знать при запуске программы, какой формат использовать.

Возможно ли это с помощью FileHelpers? Я полагаю, я мог бы добавить строковый столбец, например:

[FieldTrim(TrimMode.Both)] 
[FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
public string DOBAsString; 

, и заставить FileHelpers считывать данные в это поле и самостоятельно преобразовывать их в поле DOB в цикле. Есть ли более чистый способ?


person Moe Sisko    schedule 11.06.2015    source источник


Ответы (1)


Проще всего было бы использовать ConverterKind.DateMultiFormat вместо ConverterKind.Date

[FieldTrim(TrimMode.Both)] 
[FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
[FieldConverter(ConverterKind.DateMultiFormat, "d-MMMM-yyyy", "d-MMMM-yy"]
public DateTime DOB;

В общем, еще один способ указать формат во время выполнения — использовать классы времени выполнения с ClassBuilder:

FixedClassBuilder cb = new FixedLengthClassBuilder("Customers"); 

cb.AddField("DOB", 8, typeof(DateTime)); 
cb.LastField.Converter.Kind = ConverterKind.Date; 
cb.LastField.Converter.Arg1 = "d-MMMM-yyyy"; // or whatever
cb.LastField.TrimMode = TrimMode.Both; 
cb.LastField.FieldNullValue = DateTime.Now;          

engine = new FileHelperEngine(cb.CreateRecordClass()); 
person shamp00    schedule 11.06.2015