我无法重现您的问题:您提供的示例 CSV 文件对我来说很好用。但是,我使用的是 VS Code,而不是 Visual Studio;问题的根源可能在 Visual Studio 2017 中的某个地方,而不是在 FSharp.Data 中。这是我所做的:
- 创建一个新的空项目文件夹。
- 将 Paket 引导程序复制到其中,
.paket/paket.bootstrapper.exe。
- 运行
paket init。
- 编辑
paket.dependencies 文件以添加FSharp.Data。
- 运行
paket install。
- 运行
paket generate-load-scripts,它在.paket/load 文件夹中创建了一堆脚本来一次加载所有依赖项。 (我喜欢这个脚本功能!)
-
创建了script.fsx,内容如下:
#load ".paket/load/net452/FSharp.Data.fsx"
open FSharp.Data
type Csv = CsvProvider<"/home/rmunn/Downloads/tmp/csv/FL_insurance_sample.csv">
let data = Csv.GetSample()
printfn "%A" data.Headers
let firstRow = data.Rows |> Seq.head
printfn "%A" firstRow
在 VS Code 中,选择整个脚本文件并按 Alt+Enter 将其发送到 F# 交互窗口。
这是我得到的输出:
F# Interactive for F# 4.1
Freely distributed under the Apache 2.0 Open Source License
For help type #help;;
> # silentCd @"/home/rmunn/code/fsharp/tmp/foo";;
- # 1 @"/home/rmunn/code/fsharp/tmp/foo/script.fsx"
- ;;
(snip the copy of my script that F# Interactive echoed)
[Loading /home/rmunn/code/fsharp/tmp/foo/.paket/load/net452/Zlib.Portable.fsx
Loading /home/rmunn/code/fsharp/tmp/foo/.paket/load/net452/FSharp.Data.fsx]
namespace FSI_0002.Zlib
namespace FSI_0002.FSharp
Some
[|"policyID"; "statecode"; "county"; "eq_site_limit"; "hu_site_limit";
"fl_site_limit"; "fr_site_limit"; "tiv_2011"; "tiv_2012";
"eq_site_deductible"; "hu_site_deductible"; "fl_site_deductible";
"fr_site_deductible"; "point_latitude"; "point_longitude"; "line";
"construction"; "point_granularity"|]
(119736, "FL", "CLAY COUNTY", 498960M, 498960M, 498960M, 498960M, 498960M,
792148.9M, 0M, 9979.2M, 0, 0, 30.102261M, -81.711777M, "Residential", "Masonry",
1)
type Csv = FSharp.Data.CsvProvider<...>
val data : FSharp.Data.CsvProvider<...>
val firstRow : FSharp.Data.CsvProvider<...>.Row =
(119736, "FL", "CLAY COUNTY", 498960M, 498960M, 498960M, 498960M, 498960M,
792148.9M, 0M, 9979.2M, 0, 0, 30.102261M, -81.711777M, "Residential",
"Masonry", 1)
val it : unit = ()
然而,一切都没有完全顺利进行。然后,当我尝试处理每一行时,出现以下异常:
System.Exception:无法根据架构解析第 2439 行:在 fl_site_deductible 中期望 Int32,得到 68817.6
(我省略了回溯,因为知道 FSharp.Data 中的哪个行号引发了该异常不会对您特别有帮助)。
这个问题的原因可以在CsvProvider documentation的“控制列类型”部分看到,内容如下:
默认情况下,CSV 类型提供程序会检查前 1000 行来推断类型,但您可以通过指定 CsvProvider 的 InferRows 静态参数来自定义它。如果您指定 0,则将使用整个文件。
有两种方法可以解决“推断为 int 但应该是十进制”的问题。一种是将InferRows=0 添加到您的CsvProvider 类型定义中。另一种方法是指定一个显式模式,通过仅查看前 1,000 行来告诉 CsvProvider 哪些行会出错。 (如果您的数据集很大,这是更可取的,因为查看所有行以推断数据类型将花费太长时间)。有关示例,请参阅文档,但您会执行 Schema="fl_site_deductible=decimal" 之类的操作。
因此,如果您的代码无法在 Visual Studio 中运行,请查看 VS Code(带有 Ionide-Paket、Ionide-FSharp 和 Ionide-FAKE 扩展)是否适合您。