F#CsvTypeProvider - 来自推断类型的映射函数

时间:2016-07-30 14:00:22

标签: f# type-providers f#-data

我正在使用CsvTypeProvider将CSV文件中的数据映射到我自己的数据结构中。这非常有效,除了我每次都必须重复映射函数:

type GamesFile = CsvProvider<"./data/15.csv">
let games15 = GamesFile.Load("./data/15.csv").Rows |> Seq.map ( fun c -> { Division = c.Div; Date = c.Date; HomeScore = c.HomeScore; AwayScore = c.AwayScore })
let games16 = GamesFile.Load("./data/16.csv").Rows |> Seq.map ( fun c -> { Division = c.Div; Date = c.Date; HomeScore = c.HomeScore; AwayScore = c.AwayScore })

当我尝试将其移动到函数时,我被告知“基于此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型注释来约束对象的类型这可能允许解析查找。“

这是有道理的,但是如何从CSV的内容推断类型时,如何告诉映射函数它是什么类型?这通常是如何解决的?

1 个答案:

答案 0 :(得分:5)

类型提供程序生成一个表示该行的类型,并将其公开为主要提供类型的嵌套类型 - 在您的情况下别名为GamesFile

这并不完全是显而易见的,因为编辑会显示工具提示,例如
CsvFile<...>.Row因此它不显示别名的名称,但它表明Row是嵌套类型。要在代码中使用该类型,您只需编写GamesFile.Row,因此您需要这样的内容:

type GamesFile = CsvProvider<"./data/15.csv">

let mapRows (rows:seq<GamesFile.Row>) = 
  rows |> Seq.map (fun c -> 
    { Division = c.Div; Date = c.Date; HomeScore = c.HomeScore; AwayScore = c.AwayScore })

let games15 = GamesFile.Load("./data/15.csv").Rows |> mapRows
let games16 = GamesFile.Load("./data/16.csv").Rows |> mapRows