sev*_*rin 3 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 })
Run Code Online (Sandbox Code Playgroud)
当我尝试将它移动到一个函数时,我被告知"基于此程序点之前的信息查找不确定类型的对象.在此程序点之前可能需要类型注释来约束对象的类型.这可能允许解析查找."
这是有道理的,但是如何从CSV的内容推断类型时,如何告诉映射函数它是什么类型?这通常如何解决?
类型提供程序生成一个表示该行的类型,并将其公开为主要提供类型的嵌套类型 - 在您的情况下为别名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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |