【问题标题】:How to append columns to existing CSV using Ruby 2.2.2如何使用 Ruby 2.2.2 将列附加到现有 CSV
【发布时间】: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/5452781stackoverflow.com/questions/4397412 中提供了一些很好的答案。
  • 但两个答案都涉及编辑文件而不是 CSV。我正在使用 CSV 类,这不是不同的方法吗?

标签: ruby csv


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    相关资源
    最近更新 更多