Как записать в новую строку CSV с каждым циклом в Ruby - PullRequest
0 голосов
/ 20 июня 2019

Я уверен, что есть очень простое решение для этого, но не смог понять это из документов.По сути, я делаю цикл и выполняю вызов 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 голосов
/ 20 июня 2019

Давай позволим

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"] 
...

до бесконечности . См. Массив # цикл . Прежде чем мы забудем, сбросим @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
0 голосов
/ 20 июня 2019

Это потому, что вы предоставляете 'w' (запись и усечение) для CSV.open. Если вы хотите добавить, вы должны вместо этого передать «а». См. Ruby-doc.org/core-2.0.0/IO.html#method-c-new-label-IO+Open+Mode

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...