CSVHelper: сохранение значений карты в переменной

#c#

#c#

Вопрос:

Я пытаюсь написать файл .csv, где поле ArrivalDate типа даты и времени должно быть отформатировано в соответствии с counterparty полем, как я пытаюсь сделать с FormatDate помощью функции ниже. Однако я не могу сохранить counterparty значение в переменной, которая будет передана в качестве параметра уже упомянутой функции.

 public class FuturesFilesMapping : BaseTypeConfiguration<FuturesFilesModel>
    {
        public FuturesFilesMapping()
        {
            var counterparty = Map(i => i.Counterparty).Constant("counterparty");

            Map(i => i.TradeDate).Name("Trade Date").Index(1).TypeConverterOption.Format("dd/MM/yyyy");
            Map(i => i.BmfAccount).Name("A/C Ref").Index(2);
            Map(i => i.Side).Name("B/S").Index(3);
            Map(i => i.Quantity).Name("Lots").Index(4);
            Map(i => i.Strike).Name("Strike").Index(5);
            Map(i => i.Type).Name("Type").Index(6);
            Map(i => i.Payout).Name("Call/Put").Index(7);
            Map(i => i.Price).Name("Price").Index(8);
            Map(i => i.Ticker).Name("Ric").Index(9);
            Map(i => i.Broker).Name("Exec Firm Name").Index(10);
            Map(i => i.Counterparty).Name("Contraparte").Index(11);
            Map(i => i.Desk).Name("Mesa").Index(12);
            Map(i => i.Exchange).Name("Exchange").Index(13);
            Map(i => i.ArrivalDate, ).Name("delivery").Index(14).TypeConverterOption.Format(FormatDate(counterparty));
            Map(i => i.Currency).Name("Curr").Index(15);
            Map(i => i.ContractId).Name("Age").Index(16);
        }

        public static string FormatDate(string couterparty)
        {
            if (couterparty.Equals("FCM CITIGROUP GLOBAL MARKETS INC"))
            {
                return "MMM-yy";
            }
            else
            {
                return "dd MMM yyy";
            }
        }
    }
  

Кто-нибудь может сказать мне, могу ли я выполнить это условное форматирование в классе сопоставления?

Комментарии:

1. Сопоставление выполняется только во время настройки, я предполагаю couterparty , что оно может отличаться в каждой строке ваших данных, верно?

2. Да, это может быть по-другому, но это не всегда.

3. Опубликуйте, как вы пишете свой CSV-файл.

Ответ №1:

вы можете использовать TypeConverter

 Map(m => m.ArrivalDate, ).Name("delivery").Index(14).TypeConverter<MyDateConverter>();
  

затем

 public class MyDateConverter : DefaultTypeConverter
{
    public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
    {
        if (row.GetField("Contraparte").Equals("FCM CITIGROUP GLOBAL MARKETS INC"))
            return DateTime.ParseExact(text, "MMM-yy", System.Globalization.CultureInfo.InvariantCulture) );

        return DateTime.ParseExact(text,  "dd MMM yyy", System.Globalization.CultureInfo.InvariantCulture) );
    }

    public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
    {
        throw new NotImplementedException();
    }
}
  

Комментарии:

1. И какой тип я должен поместить MyDateConvert <> в сопоставление? Как бы то ни было, в сопоставлении есть ошибка из-за отсутствия типа в вызове функции

2. таким образом, я могу вернуть следующее сообщение об ошибке (не очень понятное): «Произошла непредвиденная ошибка».

3. вы пытались отладить MyDateConverter ?

4. программа даже не входит в класс.