2012-04-05 7 views
0

Ich hatte Hilfe von der Community, um einige Gifs und URLs zu hilfreichen Daten in einer HTML-Tabelle zu ersetzen, bevor sie in ein 2D-Array gepackt wurde , aber ich denke, was ich wirklich brauche, ist jede Zeile der Tabelle als Hash in einem ActiveRecord-Eintrag zu speichern.Beginn der Verwendung von ActiveRecord - Ich möchte eine HTML-Tabelle speichern und in einen Hash konvertieren

Hier ist die erste Reihe von Beispieldaten mit Header:

html2 = <<TABLE2 
<table class="status"> 
<caption class="status">Drive status</caption> 
<tr class="status"> 
<th class="status"></th> 
<th class="status">Drive</th> 
<th class="status">State</th> 
<th class="status">Health</th> 
<th class="status">Make/Model</th> 
<th class="status">Speed</th> 
<th class="status">Serial</th> 
<th class="status">Firmware</th> 
<th class="status"><a href="/cgi-bin/status_dylan?cont=0&amp;dylan=0&amp;display=1">Sectors</a></th> 
<th class="status">Temp</th> 
<th class="status"> </th> 
</tr> 
<tr class="status"> 
<td class="status"><img border="0" src="/tick_green.gif"></td> 
<td class="status">0</td> 
<td class="status">Ready</td> 
<td class="status"><a href="/cgi-bin/status_drive?cont=0&amp;dylan=0&amp;drive=0"><img border="0" src="/bar10.gif"></a></td> 
<td class="status">SEAGATE ST3146807FC</td> 
<td class="status">10000 RPM</td> 
<td class="status">3HY61E1B</td> 
<td class="status">XR12</td> 
<td class="status">286749488</td> 
<td class="status"> 29.0&#176;C</td> 
<td class="status" style="background-color: #fefe00">&#160; 
</td> 
</tr> 

clean_table2 = [] 
    table2.css('tr').each do |tr| 
    clean_row = [] 
    tr.css('td').each do |td| 
     #for each cell, look for img tags, and replace the images with text as appropriate, then strip the html 
     img = td.at('img') 
     clean_row.push case 
     when img && img[:src][/bar(\d+)\.gif/] then 'Health: '+$1 
     when img && img[:src][/tick_green/] then 'Healthy' 
     when img && img[:src][/cross_red/] then 'Failed' 
     when img && img[:src][/caution/] then 'Caution' 
     else td.text.strip 
     end 

    end 
    clean_table2.push clean_row 
    #puts clean_row[5] 
    end 
    puts "\n" 
#puts clean_table.join("\n") 
clean_table2.each {|x| 
    puts "#{x}" 
} 

Hier ist der Code alles unwichtig und ersetzen Sie die ‚nicht hilfreich‘ Gifs mit rationalen Text abzustreifen - = aber die Hashes Ich schaffe aren nicht so nützlich, wie ich es mir erhofft hatte - also würde ich lieber einen Hash erstellen, indem ich die Tabellenköpfe als Schlüssel verwende Dann kann ich dies mit Serverseriennummern und Array-Adressen in einen ActiveRecord-Eintrag eingeben, damit ich Deltas vergleichen und anzeigen kann Instanzen der Datensätze (z. B. wenn der Laufwerkzustand von 10 auf 5 fällt) Was denken Sie alle? Ich kann die Arrays vergleichen, aber ich denke, da Rekord-Abruf schnell ist, kann ich nur bestimmte Änderungen speichern, anstatt ein 2-d-Array jedes Mal zu speichern, wenn es eine Änderung gibt (die ich denke, wird außer Kontrolle geraten)

... wie Sie wahrscheinlich erraten kann, bin ich auch zu versuchen, dies in meinem Kopf gerade zu bekommen;) vielen dank Scott

Antwort

0

neu geschrieben leicht und machte es ein bisschen mehr logisch ...

table = html_page.parser.xpath('//table/caption[contains(.,"Drive")]/..') 
    #loop through each row individually (or do I want to chuck the whole thing into a nice juicy hash) 
    #Am I using this? #REMOVE 
    clean_table = Array.new 
    clean_head=[] 
    table.css('tr').each do |tr| 
    #stash WWN number, fake interface and fake address [can get, but not needed at this stage] 
    clean_row = {:wwn=>cells[0],:dyl_if=>'1',:dyl_addr=>'0'} 
    #grab headers 
    tr.css('th').each_with_index do |th,i| 
     if i == 0 
     clean_head.push "Drive Health" 
     else if i == 10 
     clean_head.push "BG Temp" 
     else clean_head.push th.text.strip 
     end 
    end 
    end 
    #each td in each tr - add index so I can add table headers as keys in hash 
    tr.css('td').each_with_index do |td, i| 
     #for each cell, look for img tags, and replace the images with text as appropriate, then strip the html 
     img = td.at('img') 

     clean_row[clean_head[i]] = case 
     when img && img[:src][/bar(\d+)\.gif/] then 'Health: '+$1 
     when img && img[:src][/tick_green/] then 'Healthy' 
     when img && img[:src][/cross_red/] then 'Failed' 
     when img && img[:src][/caution/] then 'Caution' 
    else td.text.strip 
     end 
    end 
    #Debug output - confirm nothing cocked up 
    puts clean_row 
    if clean_row.has_key?("Health") 
     Drive_Record.create(clean_row) 
     puts "Add Drive Recprd" 
    end 

end 
Verwandte Themen