Как передать пользовательский формат даты в CsvProvider в F#

#f#

#f#

Вопрос:

Я использую CsvProvider для анализа CSV-файла, который я получаю из внешнего источника. Формат даты файла — дд / ММ / гг. Но CsvProvider выводит его как MM / dd / yy и получает все даты неправильно.

Могу ли я каким-либо образом передать формат даты в CsvProvider?

Я могу прочитать даты как строку, а затем преобразовать их с помощью Seq.Map в Datetime (что составляет два шага).

Я пытаюсь выяснить, могу ли я сделать это за один шаг

Пример

образец csv-файла.csv содержит данные, подобные приведенным ниже

 11/01/90
12/01/90
13/01/90
14/01/90
15/01/90

  

Я использую приведенный ниже код F #

 type MyCsvProvider = CsvProvider<Sample= "sample.csv", HasHeaders=false, Schema="Date (date)">
MyCsvProvider.Load("sample.csv")
  

Ответ №1:

У CsvProvider поставщика типов нет способа явно указать формат для синтаксического анализа дат, поэтому, если у вас какой-то совершенно нестандартный формат, вам просто нужно прочитать его как string (что и делает поставщик CSV, если он не может автоматически анализировать даты), а затем явно проанализировать значения даты.

Тем не менее, вы можете указать Culture параметр, который позволяет анализировать даты в формате, распространенном в странах за пределами США. Например, ваш формат даты будет хорошо работать с en-GB культурой (в Великобритании вы сначала пишете день, затем месяц, а затем год).

В следующем небольшом примере Test свойство выводится как DateTime :

 type A = CsvProvider<"""Test
11/01/90
12/01/90
13/01/90
14/01/90
15/01/90""",Culture="en-GB">

let r = A.GetSample().Rows |> Seq.head
r.Test
  

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

1. Спасибо, Томас. Я буду жить с вашим решением, поскольку лучшего варианта нет.