2015-05-13 115 views
0

我還是相當新的編碼,我試圖瞭解操縱CSV文件。Ruby:將值寫入CSV文件中的特定位置

下面的代碼打開指定的CSV文件,轉到列B(header = url)中的CSV文件中的每個網址,並在網頁上找到價格。從CSV文件

實施例的數據:

Store,URL,Price 
Walmart,http://www.walmart.com/ip/HP-11.6-Stream-Laptop-PC-with-Intel-Celeron-Processor-2GB-Memory-32GB-Hard-Drive-Windows-8.1-and-Microsoft-Office-365-Personal-1-yr-subscription/39073484 
Walmart,http://www.walmart.com/ip/Nextbook-10.1-Intel-Quad-Core-2-In-1-Detachable-Windows-8.1-Tablet/39092206 
Walmart,http://www.walmart.com/ip/Nextbook-10.1-Intel-Quad-Core-2-In-1-Detachable-Windows-8.1-Tablet/39092206 

我無法編寫價格在同一CSV相鄰列C(=標題價格)。

require 'nokogiri' 
require 'open-uri' 
require 'csv' 

contents = CSV.open "mp_lookup.csv", headers: true, header_converters: :symbol 
contents.each do |row| 
    row_url = row[:url] 
    goto_url = Nokogiri::HTML(open(row_url)) 
    new_price = goto_url.css('meta[itemprop="price"]')[0]['content'] 

#---- 
#In this section, I'm looking to write the value of new_price to the 3rd column in the same CSV file 

#---- 

end 

在過去,我已經能夠使用:

in_file = open("mp_lookup.csv", 'w') 
in_file.write(new_price) 

但是,這似乎並沒有在這種情況下工作。

任何幫助表示讚賞!

+1

你需要使用CSV嗎? CSV是一種可變記錄長度格式,因此更改行通常意味着逐行復制文件並沿途更改所需的行。 CSV是用於數據交換的一種很好的格式,但它造成了一個糟糕的數據庫。 –

+0

我想我不需要。我看過沿着File.open,file.readlines.each,line.split(',')[1]等代碼的代碼。你認爲類似的東西會更好嗎? – NickJ987

+0

我剛纔意識到,我應該澄清一點,我必須使用CSV或文本文件,但我不一定非要使用CSV寶石或其他任何東西。 – NickJ987

回答

0

簡單的答案是,您可以參考CSV文件中的:price列,就像您參考:url列一樣。試試這個代碼把價格定在CSV對象存儲:

row[:price] = new_price 

你已經通過所有的記錄讀取之後,你要保存的CSV文件再次。您可以將其保存到任何文件名,但我們會簡單地覆蓋以前的文件,在這個例子中:

CSV.open("mp_lookup.csv", "wb") do |csv| 
    contents.each do |row| 
     csv << row 
    end 
end 

在真實的生產環境中,你會想更多的容錯比這個寬容,並保留原始文件直到過程結束。但是,這顯示瞭如何更新每行的價格列中的值,然後將更改保存到文件。

相關問題