从CsvFile.Load获取名称作为数组的列(或从csv创建数组的字典)

时间:2014-01-09 20:13:25

标签: f# f#-data

我有以下代码来加载csv。从“msft”(最好是名字)作为数组获取列的最佳方法是什么?或者我应该以不同的方式加载数据吗?

#r "FSharp.Data.dll"
open FSharp.Data.Csv

let msft = CsvFile.Load("http://ichart.finance.yahoo.com/table.csv?s=MSFT").Cache()

编辑:或者,将csv导入由列名称键入的数组字典中的有效方法是什么?如果我真的应该为此创建一个新问题,请告诉我。尚不熟悉所有stackoverflow标准。

3 个答案:

答案 0 :(得分:2)

基于Latkin的回答,这似乎是做功能的F#方式。

let getVector columnAccessor msft = 
    [| yield! msft.Data |> Seq.map columnAccessor |]

(* Now we can get the column all at once *)
let closes = getVector (fun x -> x.Close) msft

(* Or we can create an accessor and pipe our data to it. *) 
let getCloses = getVector (fun x -> x.Close)    
let closes = msft |> getCloses

我希望这会有所帮助。

答案 1 :(得分:1)

我也经历了this example。像下面这样的东西应该这样做。

let data = 
    msft.Data
    |> List.fold (fun acc row -> row.Date :: acc) List.Empty<DateTime>

这里我正在管道msft.Data列表的msft数据记录并将其折叠到该列表中的一个项目的列表中。请查看文档中提到的所有功能。我还没跑过这个。

答案 2 :(得分:0)

当您说要“按名称”列时,不清楚您是否“有人将列名称作为字符串传递给我”或“我在代码中使用列名称”。类型提供者对于后一种情况是完美的,但对前者并没有真正的帮助。

对于后一种情况,您可以使用:

let closes = [| yield! msft.Data |> Seq.map (fun x -> x.Close) |]

如果是前者,您可能需要考虑以其他方式读取数据,也许是以列名称键入的字典。

类型提供程序的重点是使所有这些强类型和以代码为中心,并且不再将列名称作为可能有效或可能无效的字符串传递。