splitting string to hash

Discussion in 'Ruby' started by Brian Nice, Aug 31, 2006.

  1. Brian Nice

    Brian Nice Guest

    I have a strings like the following:
    s1- "[1] Hello [2] bye"
    s2- "[1] Hello [2] bye [2:1] continue [2] more"

    I want to convert them to hashes like
    h1- {1 => "Hello", 2 => "bye"}
    h2- {1 => "Hello", 2 => "bye", "2:1" => "continue", "2:2" => more"}

    Is there an easy Ruby way to do this?
    Thanks for the help
    Brian

    --
    Posted via http://www.ruby-forum.com/.
    Brian Nice, Aug 31, 2006
    #1
    1. Advertising

  2. On Aug 31, 2006, at 9:38 AM, Brian Nice wrote:

    > s2- "[1] Hello [2] bye [2:1] continue [2] more"


    > h2- {1 => "Hello", 2 => "bye", "2:1" => "continue", "2:2" => more"}


    I assume more is missing a quote there.

    Also, how was the 2:2 key determined?

    James Edward Gray II
    James Edward Gray II, Aug 31, 2006
    #2
    1. Advertising

  3. Brian Nice wrote:
    > I have a strings like the following:
    > s1- "[1] Hello [2] bye"
    > s2- "[1] Hello [2] bye [2:1] continue [2] more"
    >
    > I want to convert them to hashes like
    > h1- {1 => "Hello", 2 => "bye"}
    > h2- {1 => "Hello", 2 => "bye", "2:1" => "continue", "2:2" => more"}
    >
    > Is there an easy Ruby way to do this?
    > Thanks for the help
    > Brian


    Assuming that James is correct in that :2 is missing from the second
    string, this works:

    h2 = Hash[*s2.scan(/\[([^\[\]]+)\] (\w+)/).flatten]

    (I'm starting to really like Ruby.)

    In case that's not clear, scan uses a regex to provide an array of
    2-element arrays from the text. Then flatten makes it into a single
    array, then the * turns it into a list of just values, instead of an
    array. Then Hash[] turns each 2 values into a hash.

    --
    Posted via http://www.ruby-forum.com/.
    William Crawford, Aug 31, 2006
    #3
  4. Brian Nice

    Brian Nice Guest

    William Crawford wrote:
    > Brian Nice wrote:
    >> I have a strings like the following:
    >> s1- "[1] Hello [2] bye"
    >> s2- "[1] Hello [2] bye [2:1] continue [2] more"
    >>
    >> I want to convert them to hashes like
    >> h1- {1 => "Hello", 2 => "bye"}
    >> h2- {1 => "Hello", 2 => "bye", "2:1" => "continue", "2:2" => more"}
    >>
    >> Is there an easy Ruby way to do this?
    >> Thanks for the help
    >> Brian

    >
    > Assuming that James is correct in that :2 is missing from the second
    > string, this works:
    >
    > h2 = Hash[*s2.scan(/\[([^\[\]]+)\] (\w+)/).flatten]
    >
    > (I'm starting to really like Ruby.)
    >
    > In case that's not clear, scan uses a regex to provide an array of
    > 2-element arrays from the text. Then flatten makes it into a single
    > array, then the * turns it into a list of just values, instead of an
    > array. Then Hash[] turns each 2 values into a hash.


    Actually the original was correct - the second 2 should have a key of
    2:2 even though it only appears in the original string as 2 (since it
    follows a 2:1, it is assumed that any number after it would be 2:x. If
    there was a 3:1 sometime later, then the next two would have a key of
    3:2)

    s2- "[1] Hello [2] bye [2:1] continue [2] more"

    Thanks for the help
    Brian

    --
    Posted via http://www.ruby-forum.com/.
    Brian Nice, Aug 31, 2006
    #4
  5. Brian Nice

    Alex LeDonne Guest

    On 8/31/06, Brian Nice <> wrote:
    > I have a strings like the following:
    > s1- "[1] Hello [2] bye"
    > s2- "[1] Hello [2] bye [2:1] continue [2] more"
    >
    > I want to convert them to hashes like
    > h1- {1 => "Hello", 2 => "bye"}
    > h2- {1 => "Hello", 2 => "bye", "2:1" => "continue", "2:2" => more"}
    >
    > Is there an easy Ruby way to do this?


    Brian-

    Your problem is somewhat underspecified; with more examples and info,
    someone might be able to help better. Some important questions:

    - may the phrases include spaces?
    - can there be more than two levels?
    - in your examples above, must the frist key be 1, or could it also be
    "1"? Or perhaps "1:0"?
    - perhaps some more background on the use case would help as well.

    Good luck!

    -Alex
    Alex LeDonne, Sep 6, 2006
    #5
    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. John Ericson
    Replies:
    0
    Views:
    423
    John Ericson
    Jul 19, 2003
  2. Mark
    Replies:
    0
    Views:
    440
  3. John Dibling
    Replies:
    0
    Views:
    412
    John Dibling
    Jul 19, 2003
  4. rp
    Replies:
    1
    Views:
    516
    red floyd
    Nov 10, 2011
  5. Srijayanth Sridhar
    Replies:
    19
    Views:
    612
    David A. Black
    Jul 2, 2008
Loading...

Share This Page