如何使用Ruby 2.2.2将列附加到现有CSV

时间:2015-07-07 14:35:16

标签: ruby csv

编辑:我不需要使用同一个文件。可以创建新文件。我需要的是包含与原始列和新列相同的列和行的结果,但顺序相同。

我一直在尝试使用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

但那也不起作用。

我错过了什么?谢谢!

1 个答案:

答案 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; - 读/写,从现有文件的末尾开始,如果不存在,则创建一个新文件

来源:Opening modes