[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

splitting string to hash

Brian Nice

8/31/2006 2:39:00 PM

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-....

4 Answers

James Gray

8/31/2006 2:44:00 PM

0

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

William Crawford

8/31/2006 3:21:00 PM

0

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-....

Brian Nice

8/31/2006 6:49:00 PM

0

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-....

Alex LeDonne

9/6/2006 2:36:00 PM

0

On 8/31/06, Brian Nice <bnice_99@yahoo.com> 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