F # CsvProvider не может найти элемент в строке ошибка FS0039

#f#

#f#

Вопрос:

Я пробую пример из книги Исаака Абрахама «get programming with F #». В нем я просто импортирую csv-файл в F # script и пытаюсь выполнить простые операции.

 #r "nuget: FSharp.Data"

open FSharp.Data
type Football = CsvProvider<"FootballResults.csv">
let data = Football.GetSample().Rows|> Seq.toArray
let work = data |> Seq.filter (fun i -> i.``Full Time Away Goals`` > i.``Half Time Away Goals``)
let print = work |> Seq.take 10 |> Seq.map (fun i -> i.``Half Time Home Goals``) 
let print2 = print |> Seq.iter (fun i -> printfn "%i" i)
 

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

 script.fsx(6,43): error FS0039: The type 'Row' does not define the field, constructor or member 'Full Time Away Goals'.
 

Я в значительной степени застрял здесь. Csv-файл находится здесь, и я вижу название полей в окне intellisense, но независимо от того, что я пытаюсь, я не могу выполнять какую-либо работу с полями.

Я использую VSCode с

 Microsoft (R) F# Interactive version 11.0.0.0 for F# 5.0
Copyright (c) Microsoft Corporation. All Rights Reserved.
 

Обновить:

Я использовал абсолютный путь, и это сработало; но я должен сказать, что у меня есть скрипт и csv-файл в одном каталоге.

 Directory of C:studyfsharp_Studycsv

20.01.2021  15:20    <DIR>          .
20.01.2021  15:20    <DIR>          ..
20.01.2021  15:19            26 446 FootballResults.csv
21.01.2021  08:29               373 script.fsx
               2 File(s)         26 819 bytes
               2 Dir(s)  131 790 934 016 bytes free 
 

Ответ №1:

Проблема в том, что F # не может найти «FootballResults.csv» во время выполнения, потому что он находится в каталоге, отличном от того, в котором выполняется скрипт. Самый простой способ решить эту проблему — указать полный путь к файлу .csv:

 type Football = CsvProvider<"C:MyFullPathFootballResults.csv">
 

Комментарии:

1. Вы также можете использовать, например __SOURCE_DIRECTORY__ "/FootballResults.csv" , s.t. вам не нужны абсолютные пути в вашем исходном коде (упрощает копирование / совместное использование) 🙂

2. Понятно. Однако я считаю, что F # interactive запускается во временном каталоге, а не в том, который содержит скрипт.