将哈希数组转换为csv文件

时间:2013-06-26 16:39:09

标签: ruby-on-rails csv jruby

如何将哈希数组转换为.csv文件?

我试过了

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

但是空白

5 个答案:

答案 0 :(得分:40)

试试这个:

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类编写了一个猴子补丁。

答案 1 :(得分:3)

CSV足够聪明,可以为您处理非均匀哈希。请参阅CSV::Writer#<<

的代码

所以,这可行,并且比上面的示例更简单:

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

答案 2 :(得分: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 :(得分:1)

如果所有行中的键都不相同,则当前答案失败。这是最安全的方法:

data = [{a: 1, b: 2}, {b: 3, c: 4}]

CSV.open("data.csv", "w") { |csv|
  headers = data.flat_map(&:keys).uniq
  csv << headers
  data.each { |row|
    csv << row.values_at(*headers)
  }
}

所有键都将出现在 CSV 中,即使它们没有出现在第一行中:

<头>
一个 b c
1 2
3 4

答案 4 :(得分:0)

出于某种原因,其他答案都没有对我有用,所以我也会做出贡献。以下是我的 ruby​​ 2.7 哈希数组对我有用的方法:

headers = data.map(&:keys).flatten.uniq
CSV.open("data.csv", "wb", {headers: headers} ) do |csv|
  csv << headers

  data.each do |hash|
    csv << hash
  end
end