Поставщик типа CSV не может найти столбец в интерактивном F #

Допустим, у меня есть файл CSV с заголовком, содержащим столбцы «Население» и «Прибыль», и я хотел бы работать с ним в интерактивном F #. У меня такой код:

#r "../packages/FSharp.Data.1.1.10/lib/net40/FSharp.Data.dll"

open FSharp.Data

// load csv header
let cities = new CsvProvider<"cities.csv">()

// how to reach data
let firstRow = cities.Data |> Seq.head
let firstPopulation = firstRow.Population
let firstProfit = firstRow.Profit

Я получаю сообщение об ошибке от F # interactive:

ошибка FS0039: поле, конструктор или член "Население" не определено

Мне это кажется сбивающим с толку, потому что intellisense в VS не имеет проблем с получением этого столбца из моих данных через поставщика типа CSV.

Кроме того, я попытался создать программу с поставщиком того же типа, и все работает нормально. Нравится:

open FSharp.Data

[<EntryPoint>]
let main argv = 
    use file = System.IO.File.CreateText("result.txt")
    let csv = new CsvProvider<"cities.csv">()
    for record in csv.Data do
        fprintfn file "%A" record.Population
    0

Я что-то упускаю? Спасибо за любой ответ.


person Martin Bodocky    schedule 15.12.2013    source источник
comment
Можете попробовать использовать полный путь к CSV-файлу? (Иногда F # Interactive путается с путями ...)   -  person Tomas Petricek    schedule 16.12.2013
comment
Это странно. Вы уверены, что отправили все строки в фси? Я просто попробовал что-то подобное, и это сработало. Какую версию VS вы используете?   -  person Gustavo Guerra    schedule 16.12.2013
comment
Если возникла проблема с путем, это дало бы явную ошибку, если только при изменении не будет файл city.csv где-то еще без этого столбца населения.   -  person Gustavo Guerra    schedule 16.12.2013
comment
Этот сценарий может иметь место, если вы сначала назвали свой столбец, скажем, xyzzy, заблокировали TP для сеанса FSI попыткой выполнения, затем переименовали столбец в Population и попытались выполнить снова в том же сеансе FSI. Тогда экземпляр TP в VS (и Intellisense) будет знать об изменении имени свойства, а связанный с FSI - нет. Попробуйте сбросить сеанс FSI и повторите попытку запуска.   -  person Gene Belitski    schedule 16.12.2013
comment
Томас, я изменил путь на полный, и он начинает работать. Также, Джин, ты прав. Во-первых, это было другое имя столбца.   -  person Martin Bodocky    schedule 16.12.2013
comment
@GustavoGuerra Я думаю, что видел такое поведение раньше, но только во время живого выступления, поэтому у меня не было много времени на отладку :-). Не уверен что происходит...   -  person Tomas Petricek    schedule 16.12.2013
comment
Было ли изменение CSV-файла выполнено внутри или вне VS? Возможно, это связано с github.com/fsharp/FSharp.Data/pull/283 так что может быть уже исправлено?   -  person Gustavo Guerra    schedule 16.12.2013
comment
@GustavoGuerra Я создаю CSV-файл внутри VS.   -  person Martin Bodocky    schedule 16.12.2013
comment
То же самое случилось и со мной. Я создал CsvProvider, используя относительный путь, а затем загрузил, используя полный путь. Как только я использовал полный путь для обоих, это сработало.   -  person jbeeko    schedule 28.01.2017


Ответы (1)


Попробуйте этот код

let Cities = new CsvProvider<"cities.csv">()
let cities = new Cities()
let firstRow = cities.Rows |> Seq.head
person Jozef Cechovsky    schedule 13.01.2016