如何将哈希数组转换为.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类编写了一个猴子补丁.
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)
如果所有行中的键不相同,则当前答案失败。这是最安全的方法:
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 |
如果散列不统一,那么您最终会在错误的列中得到数据。您应该使用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)
归档时间: |
|
查看次数: |
17144 次 |
最近记录: |