[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

How to parse a "line"?

Martin Sharon

4/26/2009 8:48:00 PM

Hi there:

I have a line, the format is like this
"num_of_item item1 item2...item_n" for example

"3 Tokyo Newyork Paris"

I want ruby parse this format, extract these keywords and save them in
an array.
I googled and search many forums, but can't find any matches.

Would anyone give me any ideas??
Thanks a lot!
--
Posted via http://www.ruby-....

24 Answers

James Gray

4/26/2009 8:57:00 PM

0

On Apr 26, 2009, at 3:48 PM, Martin Sharon wrote:

> Hi there:
>
> I have a line, the format is like this
> "num_of_item item1 item2...item_n" for example
>
> "3 Tokyo Newyork Paris"
>
> I want ruby parse this format, extract these keywords and save them in
> an array.
> I googled and search many forums, but can't find any matches.
>
> Would anyone give me any ideas??

If you just need to bust up the words via the spaces, this should
probably work for you:

>> items = "3 Tokyo Newyork Paris".split[1..-1]
=> ["Tokyo", "Newyork", "Paris"]

James Edward Gray II


Robert Dober

4/26/2009 9:12:00 PM

0

On Sun, Apr 26, 2009 at 10:56 PM, James Gray <james@grayproductions.net> wrote:
> On Apr 26, 2009, at 3:48 PM, Martin Sharon wrote:
>
>> Hi there:
>>
>> I have a line, the format is like this
>> "num_of_item item1 item2...item_n" for example
>>
>> "3 Tokyo Newyork Paris"
>>
>> I want ruby parse this format, extract these keywords and save them in
>> an array.
>> I googled and search many forums, but can't find any matches.
>>
>> Would anyone give me any ideas??
>
> If you just need to bust up the words via the spaces, this should probably
> work for you:
>
>>> items = "3 Tokyo Newyork Paris".split[1..-1]
> => ["Tokyo", "Newyork", "Paris"]

This is another opportunity to show Ruby's versatile style, e.g. functional

_, *items = "3 .a b c".split

R.

Todd Benson

4/26/2009 10:56:00 PM

0

On Sun, Apr 26, 2009 at 4:11 PM, Robert Dober <robert.dober@gmail.com> wrote:
> On Sun, Apr 26, 2009 at 10:56 PM, James Gray <james@grayproductions.net> wrote:
>> On Apr 26, 2009, at 3:48 PM, Martin Sharon wrote:
>>
>>> Hi there:
>>>
>>> I have a line, the format is like this
>>> "num_of_item item1 item2...item_n" for example
>>>
>>> "3 Tokyo Newyork Paris"
>>>
>>> I want ruby parse this format, extract these keywords and save them in
>>> an array.
>>> I googled and search many forums, but can't find any matches.
>>>
>>> Would anyone give me any ideas??
>>
>> If you just need to bust up the words via the spaces, this should probably
>> work for you:
>>
>>>> items = "3 Tokyo Newyork Paris".split[1..-1]
>> => ["Tokyo", "Newyork", "Paris"]
>
> This is another opportunity to show Ruby's versatile style, e.g. functional
>
> _, *items = "3 .a b c".split

I like...

(items = my_item_list).split.shift

Both you and I have examples, though, that do not return what the
statement using [1..-1] does. Mine, returns 3. Ah well, "items"
exists, though :)

Todd

Todd Benson

4/26/2009 11:00:00 PM

0

On Sun, Apr 26, 2009 at 5:55 PM, Todd Benson <caduceass@gmail.com> wrote:
>
> (items = my_item_list).split.shift

Oops...

(items = my_item_list.split).shift

Todd

Martin Sharon

4/27/2009 12:26:00 AM

0

Thank you Todd, but the number of the keywords are dynamic.

and the array size is not fixed until program reads the first keywords
of the input line.
The line may be "3 tokyo newyork paris", also maybe
"6 toyota bmw honda GM Ford"

So I can't hard coded this array in the program.
How can I parse the line?

Thanks!
Todd Benson wrote:
> On Sun, Apr 26, 2009 at 5:55 PM, Todd Benson <caduceass@gmail.com>
> wrote:
>>
>> (items = my_item_list).split.shift
>
> Oops...
>
> (items = my_item_list.split).shift
>
> Todd

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

7stud --

4/27/2009 1:09:00 AM

0

Martin Sharon wrote:
> Thank you Todd, but the number of the keywords are dynamic.
>
> and the array size is not fixed until program reads the first keywords
> of the input line.
>


Explain why these solutions won't work for you:

strs = ["6 toyota bmw honda GM Ford", "3 tokyo newyork paris"]

strs.each do |str|
puts "1) split with subscripts:"
p str.split()[1..-1]

puts "2) split with parallel assignment:"
first, *therest = str.split()
p therest

puts
end

--output:--
1) split with subscripts:
["toyota", "bmw", "honda", "GM", "Ford"]
2) split with parallel assignment:
["toyota", "bmw", "honda", "GM", "Ford"]

1) split with subscripts:
["tokyo", "newyork", "paris"]
2) split with parallel assignment:
["tokyo", "newyork", "paris"]

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

James Gray

4/27/2009 2:06:00 AM

0

On Apr 26, 2009, at 7:25 PM, Martin Sharon wrote:

> Thank you Todd, but the number of the keywords are dynamic.
>
> and the array size is not fixed until program reads the first keywords
> of the input line.
> The line may be "3 tokyo newyork paris", also maybe
> "6 toyota bmw honda GM Ford"
>
> So I can't hard coded this array in the program.
> How can I parse the line?

Did you try our code? All of our solutions work for all examples =20
you've posted so far=85 :)

James Edward Gray II=

Todd Benson

4/27/2009 2:11:00 AM

0

On Sun, Apr 26, 2009 at 7:25 PM, Martin Sharon <huangshuo.9@gmail.com> wrote:
> Thank you Todd, but the number of the keywords are dynamic.
>
> and the array size is not fixed until program reads the first keywords
> of the input line.
> The line may be "3 tokyo newyork paris", also maybe
> "6 toyota bmw honda GM Ford"
>
> So I can't hard coded this array in the program.
> How can I parse the line?

If you look closely, you'll see that James' method grabs everything
from 1 to -1 (the end) of the array, omitting the zeroth element.

Robert's method assigns the garbage -- in this case, the whole array
-- to a dummy variable, and the important stuff to the var that you
care about (items).

My way was only slightly different. I opted to create the whole
array, and then drop the first without creating an extra object. I
had to use (items = my_item_list.split) inside parens like that
because #shift returns the object you popped off the front of the
list, and not the actual remaining stuff.

In all examples given, the size doesn't really matter... hah! Or as
they say, it depends :-)

There are probably several ways to do this; I just like that particular one.

hth,
Todd

Todd Benson

4/27/2009 2:47:00 AM

0

On Sun, Apr 26, 2009 at 9:11 PM, Todd Benson <caduceass@gmail.com> wrote:
> On Sun, Apr 26, 2009 at 7:25 PM, Martin Sharon <huangshuo.9@gmail.com> wrote:
>> Thank you Todd, but the number of the keywords are dynamic.
>>
>> and the array size is not fixed until program reads the first keywords
>> of the input line.
>> The line may be "3 tokyo newyork paris", also maybe
>> "6 toyota bmw honda GM Ford"
>>
>> So I can't hard coded this array in the program.
>> How can I parse the line?
>
> If you look closely, you'll see that James' method grabs everything
> from 1 to -1 (the end) of the array, omitting the zeroth element.
>
> Robert's method assigns the garbage -- in this case, the whole array
> -- to a dummy variable, and the important stuff to the var that you
> care about (items).
>
> My way was only slightly different. I opted to create the whole
> array, and then drop the first without creating an extra object. I
> had to use (items = my_item_list.split) inside parens like that
> because #shift returns the object you popped off the front of the
> list, and not the actual remaining stuff.
>
> In all examples given, the size doesn't really matter... hah! Or as
> they say, it depends :-)
>
> There are probably several ways to do this; I just like that particular one.

You know after looking at your original post, maybe you are trying to
create a digest, i.e. a Hash or associative array, with your keys as
the first "column".

In that case, you might try...

h = {}
f = my_string_list.each_line do |line|
key = (value = line.split).shift
h[key] = value
end

...or something like that.

Todd

Todd Benson

4/27/2009 2:56:00 AM

0

On Sun, Apr 26, 2009 at 9:47 PM, Todd Benson <caduceass@gmail.com> wrote:
>
> In that case, you might try...
>
> h = {}
> f = my_string_list.each_line do |line|
> key = (value = line.split).shift
> h[key] = value
> end
>
> ...or something like that.

It's late and I'm golfing with myself. Apologies to the list for this
almost one-liner...

h = {}
s.each_line{|i|h[(v=i.split).shift]=v}