F#CSVProvider仅报告第一列数据
在任何csv文件上使用CSVprovider时,我使用了以下命令:F#CSVProvider仅报告第一列数据,csv,f#,Csv,F#,在任何csv文件上使用CSVprovider时,我使用了以下命令: type statsProvider=CsvProvider 让stats=statsProvider.Load(“../../FL\u insurance\u sample.csv”) 设firstRow=stats.Rows |>Seq.head CSVProvider仅返回第一列中的数据。它确实正确地标识了列(18)和列的名称,但是当您查看行的类型时,它们只是字符串类型,而不是元组或结构 请参见屏幕截图,第一行的类型应
type statsProvider=CsvProvider
让stats=statsProvider.Load(“../../FL\u insurance\u sample.csv”)
设firstRow=stats.Rows |>Seq.head
CSVProvider仅返回第一列中的数据。它确实正确地标识了列(18)和列的名称,但是当您查看行的类型时,它们只是字符串类型,而不是元组或结构
请参见屏幕截图,第一行的类型应为特定类型,例如元组或结构,而不是字符串
我做错了什么?使用Visual studio 2017、FSharp 4.1、.net 4.5.2和FSharp.Data 2.3.3
注意:这发生在多个至少3个csv文件中。我选择这个特定的csv只是为了演示。我无法重现您的问题:您提供的示例csv文件对我来说效果很好。但是,我使用的是VS代码,而不是VisualStudio;问题的根源可能在Visual Studio 2017的某个地方,而不是在FSharp.Data中。以下是我所做的:
.Paket/Paket.bootstrapper.exe
中paketinit
paket.dependencies
文件以添加FSharp.Data
paket安装
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
#load.paket/load/net452/FSharp.Data.fsx”
打开FSharp.Data
类型Csv=CsvProvider
让data=Csv.GetSample()
printfn“%A”数据头
设firstRow=data.Rows |>Seq.head
printfn“%A”第一行
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 = ()
F#交互式F#4.1
根据Apache2.0开源许可证免费分发
如需帮助,请键入#help;;
>#silentCd@“home/rmunn/code/fsharp/tmp/foo”;;
-#1@“/home/rmunn/code/fsharp/tmp/foo/script.fsx”
- ;;
(剪下F#Interactive回应的我的脚本副本)
[load/home/rmunn/code/fsharp/tmp/foo/.paket/load/net452/Zlib.Portable.fsx
加载/home/rmunn/code/fsharp/tmp/foo/.paket/load/net452/fsharp.Data.fsx]
名称空间FSI_0002.Zlib
名称空间FSI_0002.FSharp
一些
[|“policyID”;“statecode”;“county”;“eq_site_limit”;“hu_site_limit”;
“fl_现场限制”;“fr_现场限制”;“tiv_2011”;“tiv_2012”;
“eq现场免赔额”;“hu现场免赔额”;“fl现场免赔额”;
“FRU站点免赔额”;“点纬度”;“点经度”;“线”;
“构造”;“点粒度”;]
(119736,“佛罗里达州”,“克莱县”,498960米,498960米,498960米,498960米,498960米,498960米,
792148.9M、0M、9979.2M、0、0、30.102261M、-81.711777M,“住宅”、“砌体”,
1)
输入Csv=FSharp.Data.CsvProvider
val数据:FSharp.data.CsvProvider
val第一行:FSharp.Data.CsvProvider.Row=
(119736,“佛罗里达州”,“克莱县”,498960米,498960米,498960米,498960米,498960米,498960米,
792148.9M,0M,9979.2M,0,0,30.102261M,-81.711777M,“住宅”,
“砖石”,1)
val it:unit=()
然而,一切并不是完全顺利的。当我尝试处理每一行时,我得到了以下异常:
System.Exception:无法根据架构分析第2439行:在fl_站点中应为Int32,获得68817.6
(我省略了回溯,因为知道FSharp.Data中的哪个行号引发了该异常对您没有特别的帮助)
此问题的原因可以在“控制列类型”部分中看到,该部分内容如下:
默认情况下,CSV类型提供程序会检查前1000行以推断类型,但您可以通过指定CsvProvider的InferRows静态参数对其进行自定义。如果指定0,将使用整个文件
有两种方法可以解决“推断的整数但应该是小数”问题。一种方法是将InferRows=0
添加到CsvProvider
类型定义中。另一种方法是指定一个显式模式,通过只查看前1000行来告诉CsvProvider哪些行会出错。(如果您的数据集很大,这是最好的选择,因为查看所有行以推断数据类型将花费太长的时间)。有关示例,请参阅文档,但您可以执行类似于Schema=“fl\u site\u-relible=decimal”
的操作
所以,如果您的代码无法在Visual Studio中运行,请查看VS代码(带有Ionide Paket、Ionide FSharp和Ionide伪扩展名)是否适合您。当我在vim中打开该文件时,它显示在一行上。结果表明该文件有mac换行符(
\r
)。请尝试切换到unix换行符(\n
)?虽然包含的屏幕截图对于显示调试器中看到的值很有用,但通常最好将代码作为文本而不是屏幕截图,因为屏幕截图中的代码无法搜索。除了屏幕截图之外,您可以编辑您的问题,将您的代码作为文本包含吗?@QuickBrownFox我将文本更改为Windows CRLF,但效果与建议相同,我需要将其与更大的代码库集成。迁移到VSCode会使这变得不切实际(尽管我已经从头开始尝试VS2015,但问题是相同的),问题发生在几个(可能全部)csv文件上。您似乎正在运行mac或某种linux,因此这可能会有所不同。我在窗户上。
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 = ()