2016-08-10 7 views
7

Używam FSharp.DataHTMLProvider wyodrębnić wiersze tabeli:Automatyczne wpisywanie kolumny w HtmlProvider <...> .Table.Row>

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

zapętlenie nad rzędami (row jest seq<HtmlProvider<...>.Table2.Row>):

for row in dailySeq do 
    printfn "%A" row 

Wyniki w:

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

Kolumny takie jak # 2 i # 3 są automatycznie wpisywane przez dostawcę jako decimal i double jako ciągi zawierające HTML, takie jak "12,00 $" lub "12 USD".

  • mogę dynamicznie zmienić rodzaj tych kolumn ciągu typ wrócił z HtmlProvider<URL> przy starcie (czyli z podwójnym ciąg) (ale chciałbym wolą typ numeryczny więc mogę Deedle wyników)

  • Albo zastosować transformację ciąg wykonawcze do wartości w tych kolumnach, aby usunąć znaki nie-cyfrowe są więc ważne dziesiętny/podwójne/INT typy ...

  • Albo ja brakuje Pojęcie podstawowe (najprawdopodobniej jako Jestem F # noobie)

+1

Czy możesz podzielić się mały plik HTML, który reprodukuje problem? –

+0

czy zwraca nan na wszystkich wartościach? typeprovider zastąpi nan brakującymi wartościami. Możesz filtrować za pomocą 'Double.isNan'. Decimal i double są typami liczbowymi ... Możesz użyć 'string', aby go przekonwertować. Najlepszy byłby przykład html w istocie lub link. – s952163

+0

@ s952163 Tak, wszystkie są 'nan' (500+ wierszy) * ponad 60 stron. Spróbuję stworzyć możliwą do opublikowania stronę próbną, która odtwarza problem ... Do tej pory łatwiej jest tylko wstępnie przeanalizować strony, a następnie przekazać je do "HTMLProvider" – SushiHangover

Odpowiedz

0

myślę, że należy spróbować ustawić PreferOptionals true, że droga N/Jak stanie się pusty, a reszta na liczbę miejsc po przecinku.

type HtmlType = HtmlProvider<URL,PreferOptionals=true> lub
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)|] 

Jeśli nie ma brak wartości w tabeli, a ja pominąć PreferOptionals Kultura i następnie pojawia się następujący komunikat:

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

Nawiasem mówiąc, Mogę się mylić, ale nie mogłem znaleźć niczego, co można określić schemat tabeli, tak jak w dostawcy csv. Tak więc, gdy tylko dostanę dane, po prostu pracuję bezpośrednio z tablicą krotek, jeśli nie ma zbyt wielu elementów, które powinny być proste. W razie potrzeby możesz użyć string lub przekierować bezpośrednio do Deedle (rows |> Frame.ofRecords).

Użyłem następującej tabeli próbek.

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

+0

Dzięki, ale w tych kolumnach nie ma żadnych "N/A", wszystkie wartości są przedrostkiem za pomocą symbolu $ i mają tysiąc przecinków sformatowanych z wartością dziesiętną (centów) i bez niej. Ręcznie sprawdziłem każdy wiersz tabeli, by potwierdzić. – SushiHangover

+0

W takim przypadku pomocna byłaby jakaś próbka. Ale tak czy siak uważam, że ustaliliśmy, że parsowanie tabeli html jest nieefektywnym rozwiązaniem z dostawcą typu, więc lepiej byłoby zrobić to na zewnątrz. Zobaczę, czy mieszanie miejsc dziesiętnych i dziesiętnych spowoduje jakąkolwiek różnicę. Jednak użycie symbolu $ powinno dać Ci wartość dziesiętną (M). Jeśli nie, to problem z lokalizacją. Czy istnieje sposób, w jaki można ustawić ustawienia regionalne na US, na przykład w dostawcy typu? Parametr to "Kultura". – s952163

+0

@SushiHangover Edytowałem przykład. – s952163

Powiązane problemy