如何在Ruby中的每个循环中写入新的csv行

时间:2019-06-20 18:02:19

标签: ruby

我确定对此有一个非常基本的解决方案,但无法从文档中解决。基本上,我正在做一个循环,并在每个循环中进行API调用,然后尝试将数据写入csv。但是,每个循环都会覆盖csv的第一行,我希望每个循环将数据附加到csv的下一行。

while counter >= 1 
    high_temp = method_that_gets_high_temperature
    counter = counter - 1

    CSV.open("summer_temp.csv", "w") do |row|
        row << [month, day, year, high_temp]
    end

end

2 个答案:

答案 0 :(得分:0)

这是因为您向CSV.open提供了“ w”(写入和截断)。如果要追加,则应改为传递“ a”。参见ruby-doc.org/core-2.0.0/IO.html#method-c-new-label-IO+Open+Mode

答案 1 :(得分:0)

让我们

def api
  @api ||= [['woof', 'meow'], ['devoted', 'aloof'], ['1 life', '9 lives']].cycle
  @api.next
end

模拟您的API:

api #=> ["woof", "meow"] 
api #=> ["devoted", "aloof"] 
api #=> ["1 life", "9 lives"] 
api #=> ["woof", "meow"] 
...

无限地。参见Array#cycle。在忘记之前,请重设@api@api = nil

然后我们可以编写以下内容。

require 'csv'

def doit(fname, headers, n)
  CSV.open(fname, "w") do |csv|
    csv << headers
    n.times { csv << api }
  end
end

尝试一下:

doit('test.csv', ['dogs', 'cats'], 2)

puts File.read('test.csv') 
dogs,cats
woof,meow
devoted,aloof