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

···

--
Posted via http://www.ruby-forum.com/.

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?

···

On Sat, Nov 28, 2009 at 10:15 AM, Bruno Moura <brunormoura@gmail.com> wrote:

Bruno Moura 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 Moura 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

--
Posted via http://www.ruby-forum.com/\.