编辑:我不需要使用同一个文件。可以创建新文件。我需要的是包含与原始列和新列相同的列和行的结果,但顺序相同。
我一直在尝试使用Ruby将列附加到现有的CSV文件中,但我收到的错误是我无法理解的。这是我的代码:
CSV.foreach("test.csv", "a+") do | row |
c = Curl::Easy.perform("http://maps.googleapis.com/maps/api/geocode/json?latlng=#{row[1]},#{row[0]}&sensor=false")
result = JSON.parse(c.body_str)
if result['status'] != 'OK'
sleep(5)
else
row << result['results'][0]['formatted_address']
result['results'][0]['address_components'].each do | w |
row << w['short_name']
end
end
端
在CSV.foreach...
部分,我已尝试CSV.foreach('file.csv', 'a+')
,CSV.foreach('file.csv', 'wb')
,CSV.foreach('file.csv', 'a')
,但似乎没有任何效果。
然后我突然明白,也许我应该使用open
代替:
file = CSV.open('test.csv', 'wb')
file.each do | csv |
c = Curl::Easy.perform("http://maps.googleapis.com/maps/api/geocode/json?latlng=#{row[1]},#{row[0]}&sensor=false")
result = JSON.parse(c.body_str)
if result['status'] != 'OK'
sleep(5)
else
row << result['results'][0]['formatted_address']
result['results'][0]['address_components'].each do | w |
row << w['short_name']
end
end
end
但那也不起作用。
我错过了什么?谢谢!
答案 0 :(得分:1)
为什么不尝试使用其他模式打开文件?
看起来这就是你要找的东西:
CSV.open('test.csv', 'r+') do |row|
row << ['existing_header1','existing_header2','new_header']
end
这实际上会覆盖您刚刚指定的第一行。它起作用是因为&#39; r +&#39;从文件的开头读取,并在文件通过时覆盖任何现有的行。但在这种情况下,你只需要改变第一个:)
以下是可用于打开文件的有用模式列表。欢呼声。
&#34; R&#34; - 只读取文件的开头
&#34; R +&#34; - 从文件开头读/写
&#34; W&#34; - 只写,覆盖整个现有文件或创建新文件(如果不存在)
&#34; W +&#34; - 读/写,覆盖整个现有文件或创建新文件(如果不存在)
&#34;&#34; - 只写,从现有文件的末尾开始,或者如果不存在则创建一个新文件
&#34; +&#34; - 读/写,从现有文件的末尾开始,如果不存在,则创建一个新文件