How do you convert an array of hashes to a .csv file?
I have tried
CSV.open(\"data.csv\", \"wb\") do |csv|
@data.to_csv
end
If the hashes aren't uniform then you will end up with data in the wrong columns. You should use values_at instead:
CSV.open("data.csv", "wb") do |csv|
keys = @data.first.keys
csv << keys
@data.each do |hash|
csv << hash.values_at(*keys)
end
end
Try this:
CSV.open("data.csv", "wb") do |csv|
@data.each do |hash|
csv << hash.values
end
end
If you want the first line of the CSV to contain the keys of the hash (kind of like a header), simply do:
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
Please read the comment of @cgenco below: He wrote a monkey patch for the Array class.
CSV
is smart enough to deal with the non-uniform hashes for you. See the code for CSV::Writer#<<
So, this works, and is a bit simpler than the above examples:
CSV.open("data.csv", "wb", {headers: @data.first.keys} ) do |csv|
@data.each do |hash|
csv << hash
end
end