Ruby在hash的hash上迭代
我有以下数组,正在努力格式化它以满足我的需要Ruby在hash的hash上迭代,ruby,Ruby,我有以下数组,正在努力格式化它以满足我的需要 consolidated = [ {:name=>"Bob", :details=>{"work"=>"Carpenter", "age"=>"26", "Experience"=>"6"} }, {:name=>"Colin", :details=>{"work"=>"painting", "age"=>"20", "Experience"=>"4"} } ] 我正在尝试将
consolidated = [
{:name=>"Bob", :details=>{"work"=>"Carpenter", "age"=>"26", "Experience"=>"6"} },
{:name=>"Colin", :details=>{"work"=>"painting", "age"=>"20", "Experience"=>"4"} }
]
我正在尝试将其格式化为以下格式:
Bob work Carpenter
age 26
Experience 6
Colin work painting
age 20
Experience 4
我尝试了以下方法:
require 'csv'
CSV.open("output.csv", "wb") do |csv|
csv << ["name", "nature", "details"]
consolidated.each do |val|
csv << [val[:name], val[:details]]
end
end
#=> [{:name=>"Bob", :details=>{"work"=>"Carpenter", "age"=>"26", "Experience"=>"6"}},
# {:name=>"Colin", :details=>{"work"=>"painting", "age"=>"20", "Experience"=>"4"}}]
我不确定如何迭代第一个循环中的哈希值,只得到期望的格式
谢谢。我不知道CSV生成,因此,假设它按照您所写的方式工作,您可以通过以下方式对对象进行迭代:
consolidated = [{:name => "Bob", :details=>{"work"=>"Carpenter", "age"=>"26", "Experience"=>"6"}}, {:name => "Colin", :details=> {"work"=>"painting", "age"=>"20", "Experience"=>"4"}}]
CSV.open("output.csv", "wb") do |csv|
csv << ["name", "nature", "details"]
consolidated.each do |val|
details = val[:details]
nature_1 = details.keys.first
detail_1 = details.delete(nature_1)
csv << [val[:name], nature_1, detail_1]
details.each do |k, v|
csv << [nil, k, v]
end
end
end
注意:这将损坏原始数据阵列。所以,如果你想保存它,先复制它。或者修改逻辑以不删除val[:details]中的第一个键值。我不知道CSV生成,因此,假设它按照您编写的方式工作,您可以通过以下方式在对象上迭代:
consolidated = [{:name => "Bob", :details=>{"work"=>"Carpenter", "age"=>"26", "Experience"=>"6"}}, {:name => "Colin", :details=> {"work"=>"painting", "age"=>"20", "Experience"=>"4"}}]
CSV.open("output.csv", "wb") do |csv|
csv << ["name", "nature", "details"]
consolidated.each do |val|
details = val[:details]
nature_1 = details.keys.first
detail_1 = details.delete(nature_1)
csv << [val[:name], nature_1, detail_1]
details.each do |k, v|
csv << [nil, k, v]
end
end
end
注意:这将损坏原始数据阵列。所以,如果你想保存它,先复制它。或者修改逻辑以不从val[:details]中删除第一个键值。以下是一些让您开始的内容:
require 'csv'
data = [
{:name => "Bob", :details=>{"work"=>"Carpenter", "age"=>"26", "Experience"=>"6"}},
{:name => "Colin", :details=>{"work"=>"painting", "age"=>"20", "Experience"=>"4"}}
]
str = CSV.generate do |csv|
data.each do |datum|
datum[:details].each do |detail_key, detail_value|
csv << [datum[:name], detail_key, detail_value]
end
end
end
puts str
# >> Bob,work,Carpenter
# >> Bob,age,26
# >> Bob,Experience,6
# >> Colin,work,painting
# >> Colin,age,20
# >> Colin,Experience,4
只需迭代所有细节,并为每个键值对发出一个新行,添加一个人名
这几乎可以满足你的需要。节之间只缺少空行,并且每行上的人名都是重复的。了解如何添加这些改进将是您的家庭作业。以下是一些帮助您开始的内容:
require 'csv'
data = [
{:name => "Bob", :details=>{"work"=>"Carpenter", "age"=>"26", "Experience"=>"6"}},
{:name => "Colin", :details=>{"work"=>"painting", "age"=>"20", "Experience"=>"4"}}
]
str = CSV.generate do |csv|
data.each do |datum|
datum[:details].each do |detail_key, detail_value|
csv << [datum[:name], detail_key, detail_value]
end
end
end
puts str
# >> Bob,work,Carpenter
# >> Bob,age,26
# >> Bob,Experience,6
# >> Colin,work,painting
# >> Colin,age,20
# >> Colin,Experience,4
只需迭代所有细节,并为每个键值对发出一个新行,添加一个人名
这几乎可以满足你的需要。节之间只缺少空行,并且每行上的人名都是重复的。找出如何添加这些改进将是您的家庭作业。您需要通过每对迭代器迭代嵌入的哈希。 大概是这样的:
data = {:name => "Bob", :details=>{"work"=>"Carpenter", "age"=>"26", "Experience"=>"6"}}
CSV.open("output.csv", "wb") do |csv|
csv << ["name", "nature", "details"]
data.each do |val|
csv << [ val[:name], val[:details]['work'] ]
data[:details].each_pair do |key, value]
# here we have to drop the first pair because i've used it earlier
next if key == 'work'
csv << [ "", key, value ]
end
end
end
您需要通过每个_对迭代器迭代嵌入的哈希。 大概是这样的:
data = {:name => "Bob", :details=>{"work"=>"Carpenter", "age"=>"26", "Experience"=>"6"}}
CSV.open("output.csv", "wb") do |csv|
csv << ["name", "nature", "details"]
data.each do |val|
csv << [ val[:name], val[:details]['work'] ]
data[:details].each_pair do |key, value]
# here we have to drop the first pair because i've used it earlier
next if key == 'work'
csv << [ "", key, value ]
end
end
end
你的迭代很好,真的没有其他方法了。只是您的格式/打印需要改进。另外,请不要将其称为CSV文件。事实并非如此。即使您使用了您不使用的制表符分隔符,在解析零行/空行时仍会产生意外数据。@SergioTulentsev:我无法构造我所需的格式,并且以我有限的知识也无助于我的事业。。。任何帮助都会很有帮助,比如说。。我想导出到excel,我想导出到excel-您可以使用gem axlsx直接编写一个.xlsx文件。更可靠的结果。谢谢你的建议。你的迭代很好,真的没有其他方法。只是您的格式/打印需要改进。另外,请不要将其称为CSV文件。事实并非如此。即使您使用了您不使用的制表符分隔符,在解析零行/空行时仍会产生意外数据。@SergioTulentsev:我无法构造我所需的格式,并且以我有限的知识也无助于我的事业。。。任何帮助都会很有帮助,比如说。。我想导出到excel,我想导出到excel-您可以使用gem axlsx直接编写一个.xlsx文件。更可靠的结果。感谢您提出的建议。没有必要破坏/破坏您只是被要求打印的数据结构:是的,我的错。我会在回答中提到它。@JagdeepSingh感谢您在这里的投入!!愚弄联合公司也无济于事。这里需要一个深度dup/克隆。不需要破坏/破坏您被简单要求打印的数据结构是的,我的错。我会在回答中提到它。@JagdeepSingh感谢您在这里的投入!!愚弄联合公司也无济于事。这里需要一个深度复制/克隆。非常感谢你,并引导一个新人进入Ruby世界如果我想写Bob和colins呢once@dev:然后有时需要传递nil而不是datum[:name]。可能会升起并跟踪某种标志?…并通知任何未意识到需要该声明的人。写一行标题,名字,工作,年龄,经验,然后是鲍勃,26岁,6岁的木匠,然后是科林,28岁,4岁的画家,不是更好吗?注:当工作和年龄不被资本化时,我无法使自己将经验资本化,或者在视图或绘画中资本化木匠,或者让鲍勃和科林一起绘画。@CarySwoveland:我同意,这种格式是。。。好奇的不是我会选择的。但我不知道他们的要求。¯\_ツ_/“非常感谢你,带着一个新人来到Ruby World如果我想给Bob和colins写信呢once@dev:然后有时需要传递nil而不是datum[:name]。可能会升起并跟踪某种标志?…并通知任何未意识到需要该声明的人。写一行标题,名字,工作,年龄,经验,然后是鲍勃,26岁,6岁的木匠,然后是科林,28岁,4岁的画家,不是更好吗?注:当工作和年龄不被资本化时,我无法使自己将经验资本化,或者在视图或绘画中资本化木匠,或者让鲍勃和科林一起绘画。@CarySwoveland:我同意,这种格式是。。。好奇的不是我想要的
oose。但我不知道他们的要求。¯\_ツ_/''此代码段充满语法错误。至少还有一个逻辑错误。在一行中,我几乎踩到了DOO。双空格有点奇怪。这个代码段充满了语法错误。至少还有一个逻辑错误。在一行中,我几乎踩到了DOO。双间距有点奇怪。