我已经收集了一些数据并将其保存为以下形式的哈希数组:
info = [
{'Name' => 'Alex', 'Tel' => 999, 'E-mail' => "[email protected]"},
{'Name' => 'Ali', 'Tel' => 995, 'E-mail' => "[email protected]"}
# ...
]
但并非所有信息都始终存在:
{'Name' => 'GuyWithNoTelephone', 'E-mail' => "[email protected]"}
我想将此信息转换为CSV文件。这是我尝试过的:
def to_csv (info)
CSV.open("sm-data.csv", "wb") do |csv|
csv << ["Name", "Tel", "E-mail"]
info.each do |person|
csv << person.values
当我尝试这个时,表的格式不正确,并且说,如果缺少电话号码,那么该人的电子邮件将出现在电话栏中。
如何有选择地将此信息写入CSV文件,即如果缺少值,如何跳过列?
但遗憾的是,当我尝试这个时,表的格式不正确,并且说,如果缺少电话号码,那么该人的电子邮件将出现在电话栏中。
那是因为在这种情况下您省略了电话号码,只提供3个值中的2个。要解决此问题,您只需提供所有3个值,即使它们在哈希中不存在:
csv << ['Name', 'Tel', 'E-mail']
info.each do |person|
csv << [person['Name'], person['Tel'], person['E-Mail']]
end
或通过Hash#values_at
:
csv << ['Name', 'Tel', 'E-mail']
info.each do |person|
csv << person.values_at('Name', 'Tel', 'E-Mail')
end
对于:
{'Name' => 'GuyWithNoTelephone', 'E-mail' => "[email protected]"}
这导致:
csv << ['GuyWithNoTelephone', nil, '[email protected]']
生成此输出:(注意两个逗号,表示中间的空字段)
"GuyWithNoTelephone,,[email protected]\n"
试试这个,
def to_csv(csv_filename="sm-data.csv")
# Get all unique keys into an array:
keys = info.map(&:keys).inject(&:|)
CSV.open(csv_filename, "wb") do |csv|
csv << keys
info.each do |hash|
# fetch values at keys location, inserting null if not found.
csv << hash.values_at(*keys)
end
end
end
很简单:
path = "data/backtest-results.csv"
CSV.open(path, "wb") do |csv|
csv << ["Asset", "Strategy", "Profit"]
result_array.each do |p|
csv << p.map { |key, value| value }
end
end
使用“(File.file?(path)?”ab“:”wb“)”而不是“wb”如果你想继续添加新数据来