我正在使用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
循环行(row
是seq<HtmlProvider<...>.Table2.Row>
):
for row in dailySeq do
printfn "%A" row
结果:
(1, nan, nan, 2)
(1, nan, nan, 3)
~~~
#2和#3之类的列由提供程序自动输入为decimal
和double
,因为HTML包含诸如&#34; $ 12.00&#34;等字符串。或&#34; $ 12&#34;。
我可以动态更改在中的类型在运行时从HtmlProvider<URL>
返回的类型(即从double到string)(但我会更喜欢一个数字类型,所以我可以Deedle结果)
或者将运行时字符串转换应用于这些列中的值以删除非数字字符,使它们成为有效的decimal / double / int类型...
或者我错过了一个基本概念(很可能是因为我是F#noobie)
答案 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>