【发布时间】:2021-04-18 22:23:32
【问题描述】:
如何将散列数组转换为 .csv 文件?
我试过了
CSV.open("data.csv", "wb") do |csv|
@data.to_csv
end
但它是空白的
【问题讨论】:
-
您有一个变量 (
csv) 已设置,但从未被引用。这通常(如您的情况)是错误的指标。
标签: ruby-on-rails csv jruby
如何将散列数组转换为 .csv 文件?
我试过了
CSV.open("data.csv", "wb") do |csv|
@data.to_csv
end
但它是空白的
【问题讨论】:
csv) 已设置,但从未被引用。这通常(如您的情况)是错误的指标。
标签: ruby-on-rails csv jruby
试试这个:
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 类写了一个猴子补丁。
【讨论】:
csv << @data.to_csv 试试。
array.to_csv(csv_filename):gist.github.com/christiangenco/8acebde2025bf0891987
CSV 足够聪明,可以为您处理非均匀哈希。查看CSV::Writer#<<的代码
所以,这行得通,而且比上面的例子简单一点:
CSV.open("data.csv", "wb", {headers: @data.first.keys} ) do |csv|
@data.each do |hash|
csv << hash
end
end
【讨论】:
headers: 选项只允许您使用<< hash 而不是<< hash.values。如果要包含标题行,仍然需要csv << @data.first.keys。
如果哈希值不统一,那么您最终会得到错误列中的数据。您应该改用 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
【讨论】:
如果所有行中的键不同,则当前答案失败。这是最安全的方法:
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 中,即使它们没有出现在第一行:
| a | b | c |
|---|---|---|
| 1 | 2 | |
| 3 | 4 |
【讨论】:
data.map(&:keys).flatten.uniq
map(&:keys).flatten 和 flat_map(&:keys) 做同样的事情,但后者的性能更高。
出于某种原因,没有其他答案对我有用,所以我也会贡献自己的力量。以下是对我使用 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
【讨论】: