FSharp.Data:将多列转换为单列(字典结果)

FSharp.Data: Transform multiple columns to a single column (dictionary result)

我正在使用 FSharp.Data 转换 HTML table 数据,即

type RawResults = HtmlProvider<url>

let results = RawResults.Load(url).Tables
for row in results.Table1.Rows do
    printfn " %A " row

示例输出:

("Model: Generic", "Submit Date: July 22, 2016")
("Gene: Sequencing Failed", "Exectime: 5 hrs. 21 min.")
~~~ hundreds of more rows ~~~~

我正在尝试将那些基于 "two column" 的元素拆分为单个列序列以最终获得字典结果。

所需字典 key:value 结果:

["Model", Generic]
["Submit Date", July 22, 2016]
["Gene", "Sequencing Failed"]
~~~~

如何迭代(或拆分?)两列 (Column1Column2) 以通过管道将这两个单独的列生成字典结果?

let summaryDict = 
    results.Table1.Rows 
    |> Seq.skip 1
    |> Seq.iter (fun x -> x.Column1 ......
    |> ....

使用内置 string API 拆分 :。我通常更喜欢用咖喱形式包装 String.Split

let split (separator : string) (s : string) = s.Split (separator.ToCharArray ())

此外,虽然不是必需的,但在处理双元素元组时,我经常发现定义一个具有与此特定数据结构相关的函数的辅助模块很有用。您可以在这样的模块中放置各种函数(例如 curryuncurryswap 等),但在这种情况下,您只需要一个函数:

module Tuple2 =
    let mapBoth f g (x, y) = f x, g y

使用这些构建块,您可以轻松地将每个元组元素拆分为 :,如此 FSI 会话所示:

> [
    ("Model: Generic", "Submit Date: July 22, 2016")
    ("Gene: Sequencing Failed", "Exectime: 5 hrs. 21 min.") ]
|> List.map (Tuple2.mapBoth (split ":") (split ":"));;

val it : (string [] * string []) list =
  [([|"Model"; " Generic"|], [|"Submit Date"; " July 22, 2016"|]);
   ([|"Gene"; " Sequencing Failed"|], [|"Exectime"; " 5 hrs. 21 min."|])]

此时,您仍然需要去除前导空格,并将数组转换为您想要的格式,但我相信您可以从这里开始(否则,请询问)。