CSVHelper FormatException с DateTime

У меня проблема, в частности, с библиотекой CSVHelper.

Мой CSV-файл выглядит примерно так:

Number,Date,Account,Amount,Subcategory,Memo
 ,09/05/2017,XXX XXXXXX,-29.00,FT , [Sample string]
 ,09/05/2017,XXX XXXXXX,-20.00,FT ,[Sample string]
 ,08/05/2017,XXX XXXXXX,-6.30,PAYMENT,[Sample string]

Что я делаю с CSVHelper, так это:

        List<Transaction> result = new List<Transaction>();
        using (TextReader fileReader = File.OpenText("data.csv"))
        {
            var csv = new CsvReader(fileReader);
            result = csv.GetRecords<Transaction>().ToList();
        }

Проблема в том, что когда он пытается выполнить GetRecord в последней строке, я получаю следующее исключение:

Unhandled Exception: System.FormatException: String was not recognized as a valid DateTime.
   at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
   at System.DateTime.Parse(String s, IFormatProvider provider, DateTimeStyles styles)
   at CsvHelper.TypeConversion.DateTimeConverter.ConvertFromString(TypeConverterOptions options, String text)
   at lambda_method(Closure )
   at CsvHelper.CsvReader.CreateRecord[T]()
   at CsvHelper.CsvReader.<GetRecords>d__65`1.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)

Как видите, у данных есть некоторые проблемы - первый столбец либо пуст, либо имеет строку null. Даже в этом случае сообщение об исключении указывает на проблему с датой, которая является вторым столбцом.

Любая помощь будет оценена.


person MZokov    schedule 09.05.2017    source источник
comment
Как выглядит ваш класс Transaction? Также может быть, что CsvReader по умолчанию хочет использовать формат даты, отличный от того, который вы используете в своем файле CSV.   -  person    schedule 10.05.2017


Ответы (1)


Я предполагаю, что в вашей культуре по умолчанию указан другой формат даты, чем в CSV-файле. Попробуйте установить культуру, соответствующую данным.

    var csv = new CsvReader(fileReader);
    csv.Configuration.CultureInfo = CultureInfo.GetCultureInfo("en-GB");
    result = csv.GetRecords<Transaction>().ToList();

Сценарий: https://dotnetfiddle.net/iTvc4Y

person Brian Rogers    schedule 09.05.2017
comment
Да это оно. Спасибо! - person MZokov; 10.05.2017