在F#中使用CsvProvider

6
我是一名F#的初学者,正在尝试使用CsvProvider并重现此处给出的示例: http://fsharp.github.io/FSharp.Data/library/CsvProvider.html 因此,在F#交互环境中,我输入:
>type Stocks = CsvProvider<"MSFT.csv">;;

type Stocks = CsvProvider<...>

> let msft = CsvProvider<"MSFT.csv">.GetSample();;

val msft : CsvProvider<...>

> msft;;
val it : CsvProvider<...> =
  FSharp.Data.Runtime.CsvFile`1[System.Tuple`1[System.String]]

    {Headers = Some [|"MSFT.csv"|];
 NumberOfColumns = 1;
 Quote = '"';
 Rows = seq [];
 Separators = ",";}

> let firstRow = msft.Rows |> Seq.head;;
System.ArgumentException: The input sequence was empty.
Parameter name: source
>    at Microsoft.FSharp.Collections.SeqModule.Head[T](IEnumerable`1 source)
   at <StartupCode$FSI_0044>.$FSI_0044.main@()
Stopped due to error

我的理解是CsvProvider基于CSV文件创建了一种类型,使得以后可以读取该文件或具有相同格式的不同文件/流。我认为我没有目录问题,因为如果文件在错误的目录中,该函数将返回一个错误。当msft被创建时,F#说NumberOfColumns=1,但这显然是错误的。这也不起作用。
> let msft = Stocks.Parse("MSFT.csv");;

val msft : CsvProvider<...>

> msft;;
val it : CsvProvider<...> =
  FSharp.Data.Runtime.CsvFile`1[System.Tuple`1[System.String]]
    {Headers = Some [|"MSFT.csv"|];
     NumberOfColumns = 1;
     Quote = '"';
     Rows = seq [];
     Separators = ",";}

我正在使用FSharp.Data库,像这样:(这是正确的版本吗?)
>#r "C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I\packages\FSharp.Data.2.2.5\lib\portable-net40+sl5+wp8+win8\FSharp.Data.dll"
--> Referenced 'C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I\packages\FSharp.Data.2.2.5\lib\portable-net40+sl5+wp8+win8\FSharp.Data.dll'
> open FSharp.Data;;
> 

请帮忙!!!我已经尝试了几个小时了!谢谢!!! 编辑:以下是来自F#交互的完整日志。
Microsoft (R) F# Interactive version 14.0.23020.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

For help type #help;;

> #r "C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I\packages\FSharp.Data.2.2.5\lib\portable-net40+sl5+wp8+win8\FSharp.Data.dll"
open FSharp.Data;;

--> Referenced 'C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I\packages\FSharp.Data.2.2.5\lib\portable-net40+sl5+wp8+win8\FSharp.Data.dll'

> open FSharp.Data;;
> #I "C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I";;

--> Added 'C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I' to library include path

> let msft = CsvProvider<"MSFT.csv">.GetSample();;

val msft : CsvProvider<...>

> msft;;
val it : CsvProvider<...> =
  FSharp.Data.Runtime.CsvFile`1[System.Tuple`1[System.String]]
    {Headers = Some [|"MSFT.csv"|];
     NumberOfColumns = 1;
     Quote = '"';
     Rows = seq [];
     Separators = ",";}
> let msft = CsvProvider<"C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I\MSFT.csv">.GetSample();;

  let msft = CsvProvider<"C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I\MSFT.csv">.GetSample();;
  ---------------------------------------------------------------------------------------------------^^^^^^^^^

stdin(7,100): error FS0039: The field, constructor or member 'GetSample' is not defined
> let msft = CsvProvider<"MSFT.csv">.GetSample();;

val msft : CsvProvider<...>

> let msft = CsvProvider<"C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I\MSFT.csv">.GetSample();;

  let msft = CsvProvider<"C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I\MSFT.csv">.GetSample();;
  ---------------------------------------------------------------------------------------------------^^^^^^^^^

stdin(9,100): error FS0039: The field, constructor or member 'GetSample' is not defined
> 

2
CSV文件的内容是什么?(我怀疑它是空的) - John Palmer
这是同一个文件,您可以在我提供的http链接中找到。它是一个321ko的文件。以下是前两行:日期、开盘价、最高价、最低价、收盘价、成交量、调整后收盘价。 2012-01-27,29.45,29.53,29.17,29.23,44187700,29.23 2012-01-26,29.61,29.70,29.40,29.50,49102800,29.50 - Fagui Curtain
我无法重现这个问题。当您下载文件时,如果您在使用Windows操作系统,请确保打开文件属性并取消勾选“锁定”选项。从互联网上下载的文件通常因安全原因而被“锁定”,这可能也会影响CSV提供程序。 - Mark Seemann
我确实在使用Windows,但该文件并未被阻止。我也遇到了其他文件的相同问题。我可以在Wordpad中毫无问题地打开它们。 - Fagui Curtain
1个回答

8

我猜测F#交互式在当前目录中找不到MSFT.csv文件。您可以使用Literal指定相对于当前目录的完整路径:

let [<Literal>] Sample = __SOURCE_DIRECTORY__ + "\\MSFT.csv"
type Stocks = CsvProvider<Sample>

然后您可以调用Stocks.GetSample()来读取文件。

这种错误有时会在F# Interactive中发生,特别是当您在不同文件夹中切换文件时(我认为F# Interactive会记住上一个执行命令的文件夹,但我认为它并不总是像人们期望的那样表现)。


为了清晰起见,我已经复制/粘贴了整个F#交互会话。
let x = 5;; val x : int = 5
let y = 7;; val y : int = 7
x + y;; val it : int = 12
- Fagui Curtain
1
输入完整路径时,需要转义反斜杠。您可以编写CsvProvider< @"C:\foo.csv" >或者CsvProvider<"C:\\foo.csv"> - Tomas Petricek
`> let msft = CsvProvider<"C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I\MSFT.csv">.GetSample();; let msft = CsvProvider<"C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I\MSFT.csv">.GetSample();; ----------------------------------------------------------------------------------------------------^^^^^^^^^stdin(11,101): error FS0039: The field, constructor or member 'GetSample' is not defined` - Fagui Curtain
`> let msft = CsvProvider<@"C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford I\MSFT.csv">.GetSample();; ---------------------------------------------------------------------------------------------------------------^^stdin(12,112): error FS0010: Incomplete structured construct at or before this point in quotation literal. Expected end of quotation or other token.` - Fagui Curtain
3
@ 符号前需要空格- CsvProvider< @"...." >。这有点傻,但这是 F# 解析器工作的产物,翻译完毕。 - Tomas Petricek
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接