如何将哈希数组转换为.csv文件?
我试过了
CSV.open("data.csv", "wb") do |csv|
@data.to_csv
end
但是空白
答案 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