尝试加载示例文件时 CsvProvider 错误 "The given key was not present in the dictionary" 的含义?
Meaning of CsvProvider error "The given key was not present in the dictionary" when trying to load sample file?
我在使用 fslab 提供的 FSharp.Data csv 提供程序加载 csv 文件时遇到问题,包括示例 adwords.csv 文件。
下面这个错误是什么意思?此外,当我将鼠标悬停在 Visual studio 编辑器中的代码上时,它提到 "The given key was not present in the dictionary"
问题示例:
#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 的绑定重定向和类型提供程序(可能是 FSharp 工具,我忘记了)。我会升级到 Update 2。如果这不可能,请检查您的 FSharp.Data.TypeProviders.dll
是否在 C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0.3.0.0\Type Providers
中。
由于直接引用 dll 有效,这可能是版本不匹配的问题。我的 FsLab 安装早于 VS2015 Update 1 和 2,因此将查看它在新下载时的行为是否不同。
目前与 FsLab 捆绑的 FSharp.Data 安装存在一些问题(截至 2016 年 6 月)。此问题与版本 2.3.0 有关。如果您改为使用 FSharp.Data 2.2.5,代码将按预期工作。
删除packages/FSharp.Data 文件夹并替换为2.2.5 版本。我是通过旧安装完成的,但您可以通过 Nuget
我在使用 fslab 提供的 FSharp.Data csv 提供程序加载 csv 文件时遇到问题,包括示例 adwords.csv 文件。
下面这个错误是什么意思?此外,当我将鼠标悬停在 Visual studio 编辑器中的代码上时,它提到 "The given key was not present in the dictionary"
问题示例:
#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 的绑定重定向和类型提供程序(可能是 FSharp 工具,我忘记了)。我会升级到 Update 2。如果这不可能,请检查您的 FSharp.Data.TypeProviders.dll
是否在 C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0.3.0.0\Type Providers
中。
由于直接引用 dll 有效,这可能是版本不匹配的问题。我的 FsLab 安装早于 VS2015 Update 1 和 2,因此将查看它在新下载时的行为是否不同。
目前与 FsLab 捆绑的 FSharp.Data 安装存在一些问题(截至 2016 年 6 月)。此问题与版本 2.3.0 有关。如果您改为使用 FSharp.Data 2.2.5,代码将按预期工作。
删除packages/FSharp.Data 文件夹并替换为2.2.5 版本。我是通过旧安装完成的,但您可以通过 Nuget