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

时间:2016-08-07 19:42:23

标签: f# f#-data

我使用FSharp.Data转换HTML表数据,即

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 ~~~~

我试图将这两个基于列的#34;元素分成单个列序列,最终得到字典结果。

所需的词典键:值结果:

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

你怎么能(或分割?)两列(Column1&amp; Column2)来管道这两个列以产生字典结果?

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

1 个答案:

答案 0 :(得分:2)

使用内置的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."|])]

此时,您仍然需要去除前导空格,以及将数组转换为所需格式,但我相信您可以从此处获取(否则,请询问)。