Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:将值写入CSV文件中的特定位置_Ruby_Csv - Fatal编程技术网

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

Ruby:将值写入CSV文件中的特定位置,ruby,csv,Ruby,Csv,我对编码还是相当陌生,我正在努力学习如何操作CSV文件 下面的代码打开指定的CSV文件,转到CSV文件中B列的每个url(标题=url),并在网页上查找价格 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-O

我对编码还是相当陌生,我正在努力学习如何操作CSV文件

下面的代码打开指定的CSV文件,转到CSV文件中B列的每个url(标题=url),并在网页上查找价格

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)
但在这种情况下,这似乎不起作用


感谢您的帮助

简单的答案是,您可以参考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
CSV.open(“mp_lookup.CSV”、“wb”)do|CSV|
contents.do每行|

csv您必须为此使用csv吗?CSV是一种可变记录长度格式,因此更改一行通常意味着逐行复制文件,并沿途更改所需的行。CSV是一种很好的数据交换格式,但它是一个糟糕的数据库。我想我不必这样做。我看过File.open、File.readlines.each、line.split(',')[1]等代码。你认为这样做会更好吗?我刚刚意识到我应该澄清我必须使用CSV或文本文件,但我不一定要使用CSV gem或其他任何东西。不管你使用
文件
CSV
,你最终还是会逐个记录地读取文件记录,更改需要更改的记录,然后再将它们全部写出来。或者将您的CSV导入SQLite数据库,在SQLite中完成您的工作,然后在完成后将结果转储到CSV。感谢您的帮助。我将研究使用SQLite