Хрупкость
Поставщики CSV-типов могут быть fr agile, если у вас нет хорошей схемы или образца.
Теперь получение ошибки во время выполнения почти наверняка, потому что ваши данные не ' не совпадают. Как вы это понимаете? Один из способов - сначала просмотреть ваши данные:
provinceData.Rows |> Seq.iteri (fun i x -> printfn "Row %d: %A" (i + 1) x)
Это до строки 2150. И, конечно же, следующая строка:
2020-03-11 17:00:00,ITA,19,Sicilia,994,In fase di definizione/aggiornamento,,0,0,
Вы можете увидеть последнее значение ( totale_casi
) отсутствует.
Один из параметров CsvProvider - InferRows
. Это число строк, которые провайдер проверит для создания схемы - и его значение по умолчанию равно 1000.
Итак:
type COVID = CsvProvider<uri, InferRows = 0>
Лучший способ предотвратить это в будущем происходит ручное определение выборки из подмножества данных:
type COVID = CsvProvider<"sample-dpc-covid19-ita-province.csv">
и sample-dpc-covid19-ita-province.csv
:
data,stato,codice_regione,denominazione_regione,codice_provincia,denominazione_provincia,sigla_provincia,lat,long,totale_casi
2020-02-24 18:00:00,ITA,13,Abruzzo,069,Chieti,CH,42.35103167,14.16754574,0
2020-02-24 18:00:00,ITA,13,Abruzzo,066,L'Aquila,AQ,42.35122196,13.39843823,
2020-02-24 18:00:00,ITA,13,Abruzzo,068,Pescara,PE,42.46458398,14.21364822,0
2020-02-24 18:00:00,ITA,13,Abruzzo,067,Teramo,TE,42.6589177,13.70439971,0
При этом тип totale_casi
теперь Nullable<int>
.
Если вы не возражаете против значений NaN
, вы также можете использовать:
CsvProvider<..., AssumeMissingValues = true>
Почему FSI выглядит более надежным?
FSI не более устойчивый. Это мое лучшее предположение:
Ваш источник схемы регулярно обновляется. Поставщики типов кэшируют схему , чтобы она не генерировала схему каждый раз, когда вы компилируете код, что может быть непрактично. Когда вы перезапускаете сеанс FSI, вы в конечном итоге регенерируете своего поставщика типов, но не с консольным приложением. Поэтому иногда он может быть менее подвержен ошибкам, работая с более новым источником.