Смысл ошибки CsvProvider "Указанный ключ отсутствует в словаре" при попытке загрузить файл примера?

У меня возникают проблемы при загрузке файлов CSV с помощью поставщика FSharp.Data CSV, предоставленного fslab, включая образец файла 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.
  • Версия FSharp.Data, загружаемая FSlab, называется FSharp.Data.2.3.0.
  • У меня нет других ссылок в скрипте.fsx.
  • Я использую Visual Studio Community Edition 14.0.24720.00 Обновление 1.
  • .NET версия 4.6.01038
  • Теперь я понимаю, что я не получаю всплывающее окно с вопросом, хочу ли я разрешить.dll, как я думаю, я получал, когда использовал это раньше.

2 ответа

Решение

Существует некоторая проблема с установкой FSharp.Data в настоящее время в комплекте с FsLab (по состоянию на июнь 2016 года). Эта проблема с версией 2.3.0. Если вы вместо этого используете FSharp.Data 2.2.5, код работает как положено.

Удалите папку packages/FSharp.Data и замените ее на версию 2.2.5. Я сделал это из старой установки, но вы могли сделать это из Nuget

Там нет ничего плохого с файлом. Это, например, работает:

#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

Возможно, что-то не так с вашей установкой FsLab of FSharp.Data или провайдерами безопасности типа. Попробуйте следующее, укажите путь к файлу напрямую. Если он по-прежнему не работает, просто вызовите файл FSharp.Data и попробуйте использовать поставщика типа csv непосредственно в новом проекте.

Другая информация также полезна. Версия VS, версия FSLab, у вас есть другие ссылки. и т.п.

РЕДАКТИРОВАТЬ: Спасибо за отладочную информацию. Это на самом деле очень полезно. Обновление 1 VS2015 сломало две вещи: перенаправление привязки для Fsharp и провайдеров типов (это могли быть FSharp Tools, я забыл). Я бы обновился до Обновления 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 1 и 2, поэтому при новой загрузке она будет работать по-другому.

Другие вопросы по тегам