【问题标题】:Get a column by name as array from CsvFile.Load (or create dictionary of arrays from csv)从 CsvFile.Load 按名称获取列作为数组(或从 csv 创建数组字典)
【发布时间】:2014-01-09 20:13:25
【问题描述】:

我有以下代码来加载 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 标准。

【问题讨论】:

    标签: f# f#-data


    【解决方案1】:

    以 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
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我也经历过this example。像下面这样的事情应该做到这一点。

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

      在这里,我将 msft 数据记录的 msft.Data 列表进行管道化,并将其折叠为该列表中一项的列表。请检查文档中提到的所有功能。我没有运行这个。

      【讨论】:

        【解决方案3】:

        当您说要“按名称”列时,不清楚您的意思是“有人将列名作为字符串传递给我”还是“我在代码中使用列名”。类型提供程序非常适合后一种情况,但对前一种情况没有真正的帮助。

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

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

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

        类型提供程序的全部意义在于使所有这些强类型化和以代码为中心,并避免将列名作为可能有效或无效的字符串传递。

        【讨论】:

        • 抱歉,不清楚。我真正想要的是一个由列名键入的数组字典。我想过这样做,但我不确定这是否是表示数据的“正确”方式,但你提到它的事实让我更加确定。我仍然不确定如何有效地将数据从 csv(或 sql)导入到数组字典中。有什么建议吗?
        • 你必须首先创建一个ResizeArrays(又名S.C.G.List&lt;string&gt;)的字典,因为你会在你进行的过程中建立它。读取/解析文件的第一行以填充键,然后拆分文件的每一行,将数据添加到每个适当键下的ResizeArray。可能已经有一个图书馆可以做这样的事情。
        猜你喜欢
        • 2017-09-03
        • 1970-01-01
        • 2015-02-17
        • 1970-01-01
        • 2019-06-02
        • 2020-08-20
        • 2016-08-19
        • 2012-11-25
        • 2017-02-03
        相关资源
        最近更新 更多