我无法使用 fslab 提供的 FSharp.Data csv 提供程序加载 csv 文件,包括示例 adwords.csv 文件。

下面这个错误是什么意思?此外,当我将鼠标悬停在 Visual Studio 编辑器中的代码上时,它提到“字典中不存在给定的键”

问题示例:

#load "packages/FsLab/FsLab.fsx"

open System.IO
open FSharp.Data

"adwords.csv"
|> File.ReadAllLines

let test = CsvProvider<"adwords.csv">.GetSample()

输出:
>
val it : string [] =
 [|"Criteria ID,Name,Canonical Name,Parent ID,Country Code,Target Type,Status";
    "1000010,Abu Dhabi,"Abu Dhabi,Abu Dhabi,United Arab Emirates",9041082,AE,City,Active";
"1000011,Ajman,"Ajman,Ajman,United Arab Emirates",9047096,AE,City,Active";
"1000012,Al Ain,"Al Ain,Abu Dhabi,United Arab Emirates",9041082,AE,City,Active";
"1000013,Dubai,"Dubai,Dubai,United Arab Emirates",9041083,AE,City,Active";
"2004,Afghanistan,Afghanistan,,AF,Country,Active"|]
>
>System.MethodAccessException: Attempt by method '<StartupCode$FSI_0007>.$FSI_0007.main@()' to access method 'FSharp.Data.Runtime.CsvFile`1<System.__Canon>.Create(System.Func`3<System.Object,System.String[],System.__Canon>,
at <StartupCode$FSI_0007>.$FSI_0007.main@() in C:\test.fsx:line 11
Stopped due to error

我用自己的文件遇到了这个问题,所以我从这里抓取了这个示例文件:https://raw.githubusercontent.com/fsharp/FSharp.Data/master/tests/FSharp.Data.Tests/Data/Adwords.csv

调试信息:
  • 如果我删除 FSharp.Data 库文件夹 (v 2.3.0) 并替换为 2.2.5 版,它可以正常工作,没有错误。
  • 如果我不使用 FsLab.fsx 脚本而是使用
    #I "packages/FSharp.Data/lib/net40 #r "FSharp.Data.dll"然后一切正常。
  • FsLab.fsx 脚本的路径是正确的,当我将线路发送到 fsi 时它会运行。
  • F# 版本为 14.0.23413.0。
  • FSlab下载的FSharp.Data版本为FSharp.Data.2.3.0。
  • 我在 .fsx 脚本中没有其他引用。
  • 我使用的是 Visual Studio 社区版 14.0.24720.00 更新 1。
  • .NET 版本 4.6.01038
  • 我现在意识到我没有收到弹出窗口询问我是否想要允许 .dll 就像我以前使用它时所得到的那样。
  • 最佳答案

    文件没有任何问题。例如,这有效:

    #load @"..\..\FSLAB\packages\FsLab\FsLab.fsx"
    
    open System.IO
    open FSharp.Data
    
    [<Literal>]
    let csvFile = @"C:\tmp\adwords.csv"
    File.Exists csvFile
    
    type Csv = CsvProvider<csvFile>
    let csv = Csv.Load(csvFile)
    csv.Rows
    

    您的 FSharp.Data 安装或类型提供程序安全性的 FsLab 有问题。试试下面的,直接指定文件的路径。如果它仍然不起作用,只需 nuget FSharp.Data 并尝试直接在新项目中使用 csv 类型提供程序。

    其他信息也很有帮助。 VS 版本,FSLab 版本,还有其他引用资料。等等。

    编辑: 感谢您提供调试信息。这实际上很有帮助。 VS2015 Update 1 破坏了两件事,Fsharp 的绑定(bind)重定向和类型提供程序(可能是 FSharp 工具,我忘了)。我会升级到更新 2。如果这不可能,请检查您的 FSharp.Data.TypeProviders.dll 是否在 C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.3.0.0\Type Providers 中。

    由于直接引用 dll 有效,因此可能是版本不匹配问题。我的 FsLab 安装早于 VS2015 Update 1 和 2,因此将查看它在新下载时的行为是否有所不同。

    关于f# - 尝试加载示例文件时 CsvProvider 错误 "The given key was not present in the dictionary"的含义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37751219/

    10-13 02:59