Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#CSV类型提供程序在控制台应用程序中的健壮性较差_F#_Type Providers_F# Interactive_F# Data_Fsharp.data.typeproviders - Fatal编程技术网

F#CSV类型提供程序在控制台应用程序中的健壮性较差

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

我试图用冠状病毒大流行的实时数据进行实验(不幸的是,祝我们大家好运)

我已经开发了一个小脚本,并且正在过渡到一个控制台应用程序:它使用CSV类型的提供者

我有以下问题。假设我们想按地区过滤意大利价差,我们可以将此代码输入到.fsx文件中:

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>