iterate over a hash with values containing a array of hashes

Discussion in 'Ruby' started by Bruno Moura, Nov 28, 2009.

  1. Bruno Moura

    Bruno Moura Guest

    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/.
     
    Bruno Moura, Nov 28, 2009
    #1
    1. Advertising

  2. Bruno Moura

    Guest

    On Sat, Nov 28, 2009 at 10:15 AM, Bruno Moura <> 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?
     
    , Nov 28, 2009
    #2
    1. Advertising

  3. Bruno Moura

    Bruno Moura Guest

    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
    >
    > ###========================
    >
    > # :)
    >
    > daz


    --
    Posted via http://www.ruby-forum.com/.
     
    Bruno Moura, Nov 28, 2009
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Dinesh Dinesh

    How to Iterate over nested Hashes ?

    Dinesh Dinesh, Mar 24, 2006, in forum: Ruby
    Replies:
    4
    Views:
    641
    Robert Klemme
    Mar 24, 2006
  2. Steven Hirsch

    Iterating over a hash of hash of hashes

    Steven Hirsch, Aug 19, 2008, in forum: Ruby
    Replies:
    0
    Views:
    156
    Steven Hirsch
    Aug 19, 2008
  3. Glenn Ritz

    Iterate over hash of nested hashes

    Glenn Ritz, Feb 24, 2010, in forum: Ruby
    Replies:
    10
    Views:
    263
    Robert Klemme
    Mar 1, 2010
  4. Tim O'Donovan

    Hash of hashes, of hashes, of arrays of hashes

    Tim O'Donovan, Oct 27, 2005, in forum: Perl Misc
    Replies:
    5
    Views:
    221
  5. IanW
    Replies:
    3
    Views:
    134
    Ian Stuart
    Dec 14, 2005
Loading...

Share This Page