Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby在hash的hash上迭代_Ruby - Fatal编程技术网

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。双间距有点奇怪。