Преобразовать массив хэшей в файл csv

Как вы преобразовываете массив хэшей в CSV файл?

Я пробовал

    CSV.open("data.csv", "wb") do |csv|
      @data.to_csv
    end

но он пустой

Ответы

Ответ 1

Попробуй это:

CSV.open("data.csv", "wb") do |csv|
  @data.each do |hash|
    csv << hash.values
  end
end

Если вы хотите, чтобы первая строка CSV содержала ключи хеша (вроде заголовка), просто выполните:

CSV.open("data.csv", "wb") do |csv|
  csv << @data.first.keys # adds the attributes name on the first line
  @data.each do |hash|
    csv << hash.values
  end
end

Пожалуйста, прочитайте комментарий @cgenco ниже: Он написал патч обезьяны для класса Array.

Ответ 2

Если хеши не одинаковы, вы получите данные в неправильных столбцах. Вы должны использовать values_at вместо:

CSV.open("data.csv", "wb") do |csv|
  keys = @data.first.keys
  csv << keys
  @data.each do |hash|
    csv << hash.values_at(*keys)
  end
end

Ответ 3

CSV достаточно умен, чтобы иметь дело с неоднородными хешами для вас. См. код для CSV :: Writer # & lt; & lt;

Итак, это работает и немного проще, чем приведенные выше примеры:

CSV.open("data.csv", "wb", {headers: @data.first.keys) do |csv|
  @data.each do |hash|
    csv << hash
  end
end