Iterate over a hash with values containing a array of hashes

Hi

I need iterate over a hash with values containing a array of hashes for
build a string with comma values

I tried tranform this

{“F15”=> [
{“first”=>“01” , “last”=>"" , “data”=>“ATX”, “Xcode”=>“F15”,
“type”=>“G_TRD”},
{“first”=>“Aero”, “last”=>“Z”, “data”=>“VTA”, “Xcode”=>“F15”,
“type”=>“H_TGFE”},
{“first”=>“digg”, “last”=>"" , “data”=>“GFC”, “Xcode”=>“F15”,
“type”=>“T_1000”}],
“F17”=> [
{“first”=>“X01”, “last”=>“Sx” , “data”=>“ATT”, “Xcode”=>“F17”,
“type”=>“H_TGFE”},
{“first”=>“DEF”, “last”=>“Z” , “data”=>“VTA”, “Xcode”=>“F17”,
“type”=>“G_TRD”},
{“first”=>“EDF”, “last”=>“FR” , “data”=>“CFC”, “Xcode”=>“F17”,
“type”=>“T_900”}]}

into a string like this:

“F15;first;01;last;;data;ATX;Xcode;F15;type;G_TRD”
“F15;first;Aero;last;Z;data;VTA;Xcode;F15;type;H_TGFE”
“F15;first;digg;last;;data;GFC;Xcode;F15;type;T_1000”
“F17;first;X01;last;Sx;data;ATT;Xcode;F17;type;H_TGFE”
“F17;first;DEF;last;Z;data;VTA;Xcode;F17;type;G_TRD”
“F17;first;EDF;last;FR;data;CFC;Xcode;F17;type;T_900”

I believe that this task isn’t complex, but for me is difficult to do
now

Everyone can help me with this?

thanks so much

On Sat, Nov 28, 2009 at 10:15 AM, Bruno M. [email protected]
wrote:

I need iterate over a hash with values containing a array of hashes for
build a string with comma values

I tried tranform this

into a string like this:

I believe that this task isn’t complex, but for me is difficult to do
now

How far were you able to get before getting stuck? The basic way to
iterate over a Hash is each:

irb(main):001:0> hash = {“A” => 1, “B” => 2}
=> {“A”=>1, “B”=>2}
irb(main):002:0> hash.each{|key, value|
irb(main):003:1* p value
irb(main):004:1> }
1
2
=> {“A”=>1, “B”=>2}

When the values stored in the Hash are Arrays, you can use each within
each:

irb(main):005:0> hash = {“A” => [1,2,3], “B” =>[4,5,6]}
=> {“A”=>[1, 2, 3], “B”=>[4, 5, 6]}
irb(main):006:0> hash.each{|key, array|
irb(main):007:1* p key
irb(main):008:1> array.each{|element|
irb(main):009:2* p element
irb(main):010:2> }
irb(main):011:1> }
“A”
1
2
3
“B”
4
5
6
=> {“A”=>[1, 2, 3], “B”=>[4, 5, 6]}

Does that help get you moving in the right direction?

Bruno M. wrote:

Hi

I need iterate over a hash with values containing a array of hashes for
build a string with comma values

(…)

Everyone can help me with this?

thanks so much

###========================

input = {“F15”=> [
{“first”=>“01”, “last”=>"" , “data”=>“ATX”,
“Xcode”=>“F15”, “type”=>“G_TRD”},
{“first”=>“Aero”, “last”=>“Z”, “data”=>“VTA”,
“Xcode”=>“F15”, “type”=>“H_TGFE”},
{“first”=>“digg”, “last”=>"" , “data”=>“GFC”,
“Xcode”=>“F15”, “type”=>“T_1000”}],
“F17”=> [
{“first”=>“X01”, “last”=>“Sx”, “data”=>“ATT”,
“Xcode”=>“F17”, “type”=>“H_TGFE”},
{“first”=>“DEF”, “last”=>“Z”, “data”=>“VTA”,
“Xcode”=>“F17”, “type”=>“G_TRD”},
{“first”=>“EDF”, “last”=>“FR” , “data”=>“CFC”,
“Xcode”=>“F17”, “type”=>“T_900”}]}

chk_answer = [“F15;first;01;last;;data;ATX;Xcode;F15;type;G_TRD”,
“F15;first;Aero;last;Z;data;VTA;Xcode;F15;type;H_TGFE”,
“F15;first;digg;last;;data;GFC;Xcode;F15;type;T_1000”,
“F17;first;X01;last;Sx;data;ATT;Xcode;F17;type;H_TGFE”,
“F17;first;DEF;last;Z;data;VTA;Xcode;F17;type;G_TRD”,
“F17;first;EDF;last;FR;data;CFC;Xcode;F17;type;T_900” ]

#~~~
res = [] # results

input.sort.each do |k1,a1|
a1.each do |h|
out = ‘’ << k1
[‘first’, ‘last’, ‘data’, ‘Xcode’, ‘type’].each do |k2|
out << sprintf(’;%s;%s’, k2, h[k2]) # append to string
end
res << out # push line into result array
end
end
#~~~

puts ‘*** C o r r e c t ***’ if res == chk_answer
puts res

###========================

:slight_smile:

daz

Thanks guys, you rocks!

The snippets that you showed save my time!

I can iterate over a simple hash or array, but when is necessary work if
a more complex structure, like a array of hashes or a hash of array of
hashes I
feel paralyzed.I don’t know how I should use blocks in the right way or
efficiently.

For me is really difficult to understand this.

How can I improve my practice with this kind of task?

Thanks again!

daz wrote:

Bruno M. wrote:

Hi

I need iterate over a hash with values containing a array of hashes for
build a string with comma values

(…)

Everyone can help me with this?

thanks so much

###========================

input = {“F15”=> [
{“first”=>“01”, “last”=>"" , “data”=>“ATX”,
“Xcode”=>“F15”, “type”=>“G_TRD”},
{“first”=>“Aero”, “last”=>“Z”, “data”=>“VTA”,
“Xcode”=>“F15”, “type”=>“H_TGFE”},
{“first”=>“digg”, “last”=>"" , “data”=>“GFC”,
“Xcode”=>“F15”, “type”=>“T_1000”}],
“F17”=> [
{“first”=>“X01”, “last”=>“Sx”, “data”=>“ATT”,
“Xcode”=>“F17”, “type”=>“H_TGFE”},
{“first”=>“DEF”, “last”=>“Z”, “data”=>“VTA”,
“Xcode”=>“F17”, “type”=>“G_TRD”},
{“first”=>“EDF”, “last”=>“FR” , “data”=>“CFC”,
“Xcode”=>“F17”, “type”=>“T_900”}]}

chk_answer = [“F15;first;01;last;;data;ATX;Xcode;F15;type;G_TRD”,
“F15;first;Aero;last;Z;data;VTA;Xcode;F15;type;H_TGFE”,
“F15;first;digg;last;;data;GFC;Xcode;F15;type;T_1000”,
“F17;first;X01;last;Sx;data;ATT;Xcode;F17;type;H_TGFE”,
“F17;first;DEF;last;Z;data;VTA;Xcode;F17;type;G_TRD”,
“F17;first;EDF;last;FR;data;CFC;Xcode;F17;type;T_900” ]

#~~~
res = [] # results

input.sort.each do |k1,a1|
a1.each do |h|
out = ‘’ << k1
[‘first’, ‘last’, ‘data’, ‘Xcode’, ‘type’].each do |k2|
out << sprintf(’;%s;%s’, k2, h[k2]) # append to string
end
res << out # push line into result array
end
end
#~~~

puts ‘*** C o r r e c t ***’ if res == chk_answer
puts res

###========================

:slight_smile:

daz