在HtmlProvider中自动键入列< ...> .Table.Row>

时间:2016-08-10 14:59:36

标签: f# f#-data

我正在使用FSharp.Data HTMLProvider来提取表格行:

let [<Literal>] URL = "../DailyResultsType.html"
type RawResults = HtmlProvider<URL>
let results = RawResults.Load(URL).Tables
let dailySeq =
    results.Table2.Rows
    |> Seq.tail

循环行(rowseq<HtmlProvider<...>.Table2.Row>):

for row in dailySeq do
    printfn "%A" row

结果:

(1, nan, nan, 2)
(1, nan, nan, 3)
~~~

#2和#3之类的列由提供程序自动输入为decimaldouble,因为HTML包含诸如&#34; $ 12.00&#34;等字符串。或&#34; $ 12&#34;。

  • 我可以动态更改中的类型在运行时从HtmlProvider<URL>返回的类型(即从double到string)(但我会更喜欢一个数字类型,所以我可以Deedle结果)

  • 或者将运行时字符串转换应用于这些列中的值以删除非数字字符,使它们成为有效的decimal / double / int类型...

  • 或者我错过了一个基本概念(很可能是因为我是F#noobie)

1 个答案:

答案 0 :(得分:0)

我认为您应该尝试将PreferOptionals设置为true,这样N / As将变为null,其余的数字为小数。

type HtmlType = HtmlProvider<URL,PreferOptionals=true>
type HtmlType = HtmlProvider<URL,PreferOptionals=true,Culture="en-US">

let results = HtmlType.Load(URL)
results.Tables.Table1.Rows
// val it : HtmlProvider<...>.Table1.Row [] =
// [|("Jill", "Smith", Some 50.0M); ("Eve", "Jackson", Some 100000M);
// ("John", "Doe", Some 100M); ("Jane", "Doe", null)|]

如果表中没有缺失值,并且我省略了PreferOptionals和Culture,那么我得到以下输出:

//val it : HtmlProvider<...>.Table1.Row [] =
//[|("Jill", "Smith", 50.0M); ("Eve", "Jackson", 100000M);
//("John", "Doe", 100M)|]

顺便说一句,我可能错了,但我找不到任何可以在csv提供程序中指定表格架构的内容。因此,一旦我获得数据,我将直接使用元组数组,如果没有那么多元素应该是直截了当的。如有必要,您可以使用string或直接将其传递给Deedle(rows |> Frame.ofRecords)。

我使用了以下示例表。

<table style="width:100%">
  <tr>
    <th>Firstname</th>
    <th>Lastname</th> 
    <th>Age</th>
  </tr>
  <tr>
    <td>Jill</td>
    <td>Smith</td> 
    <td>$50.0</td>
  </tr>
  <tr>
    <td>Eve</td>
    <td>Jackson</td> 
    <td>$100,000</td>
  </tr>
  <tr>
    <td>John</td>
    <td>Doe</td> 
    <td>$100</td>
  </tr>
  <tr>
    <td>Jane</td>
    <td>Doe</td> 
    <td>N/A</td>
  </tr>
</table>