2014-07-14 82 views
-1

我有這段代碼。我想在每個細節的'details'數組中插入一個新的鍵值對(mine_id,123456)。我不知道如何做到這一點。花了大約5個小時嘗試一下。我是Ruby新手,非常感謝您的幫助。紅寶石 - 插入散列值

再次感謝 問候

mineId = "123456" 

doc = Nokogiri::HTML.parse($browser.html) 
rows = doc.xpath(".//*[@id='content']/table/tbody/tr") 
details = rows.collect do |row| 
    detail = {} 
    [ 
    [:prod_year, 'td[1]/font/text()'], 
    [:prod_qtr, 'td[2]/font/text()'], 
    [:subunit_cd, 'td[3]/font/text()'], 
    [:subunit, 'td[4]/font/text()'], 
    [:qtr_hrs, 'td[5]/font/text()'], 
    [:coal_prod, 'td[6]/font/text()'], 
    [:avg_emp_cnt, 'td[7]/font/text()'], 
    ].each do |name, xpath| 
    detail[name] = row.at_xpath(xpath).to_s.strip 
    end 
    detail 
end 
+0

只是'detail [:mineId] =「123456」;詳細信息' –

回答

1

您可以右鍵調用合併細節的散列或明確設置的鍵返回從塊的詳細信息前添加鍵值。

doc = Nokogiri::HTML.parse($browser.html) 
rows = doc.xpath(".//*[@id='content']/table/tbody/tr") 
details = rows.collect do |row| 
    detail = {} 
    [ 
    [:prod_year, 'td[1]/font/text()'], 
    [:prod_qtr, 'td[2]/font/text()'], 
    [:subunit_cd, 'td[3]/font/text()'], 
    [:subunit, 'td[4]/font/text()'], 
    [:qtr_hrs, 'td[5]/font/text()'], 
    [:coal_prod, 'td[6]/font/text()'], 
    [:avg_emp_cnt, 'td[7]/font/text()'], 
    ].each do |name, xpath| 
    detail[name] = row.at_xpath(xpath).to_s.strip 
    end  
    detail.merge(:mineId => "123456") 
end 
+0

test5.rb:137:在merge中:錯誤的參數個數(2代表1)(ArgumentError) from test5.rb:137:in'block(2 levels)in

' from C:/ Ruby193 /lib/ruby/gems/1.9.1/gems/nokogiri-1.6.3.rc3-x86-mingw32/ lib/nokogiri/xml/node_set.rb:237:在C:/ Ruby193中的每個' 的塊中/lib/ruby/gems/1.9.1/gems/nokogiri-1.6.3.rc3-x86-mingw32/ lib/nokogiri/xml/node_set.rb:236:'upto' –

+0

我更新了語法錯誤。而不是,使用=> – Nishu

+0

謝謝這個作品!欣賞。你的幫助 –

0

我會做如下使用Enumerable#each_with_object

doc = Nokogiri::HTML.parse($browser.html) 
rows = doc.xpath(".//*[@id='content']/table/tbody/tr") 
details = rows.collect do |row| 
    [ 
    [:prod_year, 'td[1]/font/text()'], 
    [:prod_qtr, 'td[2]/font/text()'], 
    [:subunit_cd, 'td[3]/font/text()'], 
    [:subunit, 'td[4]/font/text()'], 
    [:qtr_hrs, 'td[5]/font/text()'], 
    [:coal_prod, 'td[6]/font/text()'], 
    [:avg_emp_cnt, 'td[7]/font/text()'], 
    ].each_with_object({:mineId => 123456}) do |(name, xpath), detail| 
    detail[name] = row.at_xpath(xpath).to_s.strip 
    end  
end 

它沒有一個Hash,其中鍵/值存在內部關係,因爲最後你會尋找使用鍵值,所以位置無所謂。這就是我在#each_with_object方法的初始參數Hash的第一位添加鍵/值對(:mine_id, 123456)的原因。

+0

謝謝你的工作。感謝你的幫助!作爲後續,我怎樣才能輸出這個csv與鍵作爲第一行和後續行中的值?我正在使用下面的代碼,但它不是那麼優雅,因爲文件被多次打開。 \t rowid = -1 \t CSV.open(「file.csv」,'a')do | csv | \t details.each do | hsh | \t ROWID + = 1 \t如果ROWID == 0 \t CSV << hsh.keys#添加標題行(列標籤) \t別的 \t CSV << hsh.values的如果/其他內部HSH \t端# \t結束hsh的行號(行) \t csv的結束號碼打開 –

+0

@ user3830713單獨的問題請...我無法在* comment *中回答。 :-) –

+0

每90分鐘只能發帖一次:( –