【发布时间】:2015-09-25 02:56:58
【问题描述】:
编辑:我不需要使用同一个文件。可以创建一个新文件。我需要的是包含与原始列和新列相同的列和行的结果,但顺序相同。
我一直在尝试使用 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
但这也没有用。
我错过了什么?谢谢!
【问题讨论】:
-
row是从 CSV 文件读取的内部表示。对其进行的修改不会影响原始 CSV 源。您需要打开另一个 CSV 文件进行写入,并在修改后将行写入该文件。这就是你所缺少的吗? -
我认为有一种方法可以修改当前文档。在文档上似乎是这样,但我无法确定......
-
就地编辑文件似乎已经在stackoverflow.com/questions/5452781 和stackoverflow.com/questions/4397412 中提供了一些很好的答案。
-
但两个答案都涉及编辑文件而不是 CSV。我正在使用 CSV 类,这不是不同的方法吗?