Ruby:将值写入CSV文件中的特定位置

时间:2015-05-13 02:31:04

标签: ruby csv

我仍然很擅长编码,而且我正在尝试学习操纵CSV文件。

下面的代码打开指定的CSV文件,转到B列(header = url)中CSV文件中的每个网址,然后在网页上找到价格。

CSV文件中的示例数据:

Web site name (fairly obvious)
Webspace (no idea what this is)

我在将该价格写入相同CSV中的相邻列C(标头=价格)时遇到了麻烦。

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

过去,我已经能够使用:

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

但在这种情况下,这似乎不起作用。

感谢任何帮助!

1 个答案:

答案 0 :(得分: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

在真实的生产环境中,您希望比此更具容错能力,并保留原始文件,直到流程结束。但是,这显示了如何更新每行的价格列中的值,然后将更改保存到文件中。