F#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)和列的名称,但是当您查看行的类型时,它们只是字符串类型,而不是元组或结构 请参见屏幕截图,第一行的类型应

在任何csv文件上使用CSVprovider时,我使用了以下命令:

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/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”第一行
    
  • 在VS代码中,选择整个脚本文件并按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 = ()
    
    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 = ()