将哈希数组转换为csv文件

20 csv ruby-on-rails jruby

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

我试过了

    CSV.open("data.csv", "wb") do |csv|
      @data.to_csv
    end
Run Code Online (Sandbox Code Playgroud)

但它是空白的

MrY*_*iji 42

试试这个:

CSV.open("data.csv", "wb") do |csv|
  @data.each do |hash|
    csv << hash.values
  end
end
Run Code Online (Sandbox Code Playgroud)

如果您希望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
Run Code Online (Sandbox Code Playgroud)

请阅读以下@cgenco的评论:他为Array类编写了一个猴子补丁.

  • 我根据这段代码编写了一个monkeypatch,所以你可以调用`array.to_csv(csv_filename)`:https://gist.github.com/christiangenco/8acebde2025bf0891987 (5认同)

nbr*_*ein 8

CSV足够聪明,可以为您处理不一致的哈希值。请参阅CSV::Writer#<<的代码

所以,这是有效的,并且比上面的例子更简单:

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


iGE*_*GEL 7

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

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

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

A C
1 2
3 4


Ari*_*bib 5

如果散列不统一,那么您最终会在错误的列中得到数据。您应该使用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
Run Code Online (Sandbox Code Playgroud)