2016-08-07 21 views
2

我使用FSharp.Data转换HTML表格数据,即FSharp.Data:变换成多列的单个柱(词典结果)

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

我试图将这些“两列”元素分成单列序列,最终得到字典结果。

期望字典键:值结果:

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

你怎么能ITER(?或拆分)的两列(Column1 & Column2)来管这两个单独列的产生词典的结果?

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

对于每个结果,原始表格数据是否以相同的格式重复两行数据? – TheInnerLight

+0

@TheInnerLight results.Table1.Rows'中的每一行都会生成一个元素,例如:'(“Model:Generic”,“Submit Date:July 22,2016”) – SushiHangover

回答

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."|])] 

在这一点上,你仍然需要剥去前导空格,以及阵列转换成你想要的格式,但我相信你可以把它从在这里(否则,请询问)。

+0

Thanks!...'Tuple2.mapBoth'确实与'seq .Table.Row>'由于类型推理不能很好地发挥作用,但是一些笨手笨脚的类型转换让我有了你的例子。 – SushiHangover