F#CSV类型提供程序在控制台应用程序中的健壮性较差
我试图用冠状病毒大流行的实时数据进行实验(不幸的是,祝我们大家好运) 我已经开发了一个小脚本,并且正在过渡到一个控制台应用程序:它使用CSV类型的提供者 我有以下问题。假设我们想按地区过滤意大利价差,我们可以将此代码输入到.fsx文件中:F#CSV类型提供程序在控制台应用程序中的健壮性较差,f#,type-providers,f#-interactive,f#-data,fsharp.data.typeproviders,F#,Type Providers,F# Interactive,F# Data,Fsharp.data.typeproviders,我试图用冠状病毒大流行的实时数据进行实验(不幸的是,祝我们大家好运) 我已经开发了一个小脚本,并且正在过渡到一个控制台应用程序:它使用CSV类型的提供者 我有以下问题。假设我们想按地区过滤意大利价差,我们可以将此代码输入到.fsx文件中: open FSharp.Data let provinceData = CsvProvider< @"https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-province/dpc
open FSharp.Data
let provinceData = CsvProvider< @"https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-province/dpc-covid19-ita-province.csv" , IgnoreErrors = true>.GetSample()
let filterDataByProvince province =
provinceData.Rows
|> Seq.filter (fun x -> x.Sigla_provincia = province)
由FSI在本地运行,效果良好
现在,如果我使用.fs文件将此代码转换为控制台应用程序;我声明完全相同的函数并使用完全相同的类型提供程序加载程序;但我没有使用最后一行来收集数据,而是将其放入一个主函数中:
[<EntryPoint>]
let main _ =
let romeProvince = filterDataByProvince "RM" |> Seq.toArray
Console.Read() |> ignore
0
然后它在控制台应用程序中也像一个符咒一样工作。当然,我希望使用类型提供程序,否则我必须添加类型定义,将模式映射到列(这将更加脆弱)。最后一行只是一个快速测试。脆弱性
如果没有好的模式或示例,CSV类型提供程序可能很脆弱
现在获得运行时错误几乎是肯定的,因为您的数据不匹配。
你怎么知道的?一种方法是先运行数据:
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\u casi
)
CsvProvider的选项之一是InferRows
。这是提供程序为构建架构而扫描的行数,其默认值恰好为1000
因此:
有了它,totale_casi
的类型现在可以null
如果您不介意NaN
值,也可以使用:
CsvProvider<..., AssumeMissingValues = true>
CsvProvider
为什么FSI看起来更健壮?
FSI并不更强大。这是我最好的猜测:
您的架构源正在定期更新。
类型提供程序,这样它就不会在每次编译代码时重新生成模式,这可能是不切实际的。当您重新启动FSI会话时,您最终会重新生成类型提供程序,但控制台应用程序却不是这样。因此,在使用较新的源代码后,它有时可能会产生不太容易出错的效果。解释得很好。非常感谢。PS:我知道这是一个模式,但我不知道如何解决它,而不是使用CsvFile。但是,为什么你认为它对FSI有效?无论如何,非常感谢你,谢谢;事实上,现在它也可以在控制台应用程序中使用原始代码;但多亏了你,我使它变得更加健壮,并且学到了一些新的东西。干杯很高兴能帮忙。保持安全:)
provinceData.Rows |> Seq.iteri (fun i x -> printfn "Row %d: %A" (i + 1) x)
2020-03-11 17:00:00,ITA,19,Sicilia,994,In fase di definizione/aggiornamento,,0,0,
type COVID = CsvProvider<uri, InferRows = 0>
type COVID = CsvProvider<"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
CsvProvider<..., AssumeMissingValues = true>