我有哈希哈希(@post),我想把它保存到csv中。对我来说很奇怪的是我的方法适用于标题但不适用于行。如果我使用
显示行 csv << (@post_csv_order.each {|element| puts single_post[element]})
我可以在屏幕上看到正确的字符串,但csv文件包含散列键的值而不是散列值的值。基本上我在csv中有5行标题而不是正确的值。
我想我需要将@post [key]哈希转换为一个基于@post_csv_order的命令的数组(包含@ post [key]哈希的键)有一个哈希方法to_a但它会不要给我我需要的订单。
我猜你可能会提出不同的方法而不是使用散列哈希,但我也想知道如何将哈希转换为具有某种预定义顺序的数组。
另一方面,如果有任何简单的方法如何将散列哈希保存到csv / table ,我很乐意重写我的代码。
require 'rubygems'
require 'faster_csv'
require 'pp'
@post = {123 => {"ForumID" => "123", "Post author" => "Thom" },
222 => {"ForumID" => "222", "Post author" => "Mark"},
345 => {"ForumID" => "345", "Post author" => "Eddy"},
444 => {"ForumID" => "444", "Post author" => "Eli"}}
@post_csv_order = [
"ForumID" ,
"Post author"
]
FasterCSV.open("test.csv", "w", { :quote_char => '"', :col_sep =>',', :row_sep =>:auto, :headers => true, :return_headers => false, :force_quotes => true}) do |csv|
csv << (@post_csv_order.each {|element| element})
@post.each_value do |single_post|
csv << (@post_csv_order.each {|element| single_post[element]})
#csv << (@post_csv_order.each {|element| puts single_post[element]})
end
end
答案 0 :(得分:3)
这一行:
csv << @post_csv_order.each {|element| single_post[element]}
遍历@post_csv_order
数组并返回数组本身,这不是你想要的。在这种情况下,each
和块实际上没有做任何事情。如果您将each
更改为map
,它会执行您想要的操作:
csv << @post_csv_order.map {|element| single_post[element]}
map
返回一个新数组,其中包含每次调用块的结果。