如何使用Ruby 2.2.2将列追加到现有的CSV文件中

4

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

我一直在尝试使用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文件进行写入,并在修改后将行写入该文件。这是您所缺少的吗? - Arie Xiao
我认为应该有一种方法可以修改当前文档。在文档中似乎是这样的,但我无法确定... - WagnerMatosUK
在原地编辑文件似乎已经在https://dev59.com/r2035IYBdhLWcg3wYe8F和https://dev59.com/GW855IYBdhLWcg3wVi23中得到了涵盖,其中有一些很好的答案。 - Synoli
可能是在Ruby中编辑文件中的每一行的重复问题。 - Synoli
另一个要点是我不需要使用同一个文件。我可以创建另一个文件,但它必须基于初始文件,并附加新的列。 - WagnerMatosUK
显示剩余2条评论
1个回答

1

为什么不尝试使用不同的模式打开文件?

看起来这就是您要找的:

CSV.open('test.csv', 'r+') do |row|
  row << ['existing_header1','existing_header2','new_header']
end

这实际上会覆盖你之前指定的第一行。它有效是因为'r+'从文件开头读取,并在逐行通过文件时覆盖任何现有行。但在这种情况下,你只需要更改第一个 :)
以下是可以用于打开文件的有用模式列表。干杯。
“r”--仅从文件开头进行读取 “r+”--从文件开头进行读写 “w”--仅写入,覆盖整个现有文件或创建新文件(如果不存在) “w+”--读/写,覆盖整个现有文件或创建新文件(如果不存在) “a”--仅写入,从现有文件末尾开始或创建新文件(如果不存在) “a+”--读/写,从现有文件末尾开始或创建新文件(如果不存在)
来源:Opening modes

这个不起作用。它不会替换第一行,只会替换第一个字符。 - Marco Altieri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接