[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

File.open with line =~ /.../

Rebhan, Gilbert

2/23/2007 7:36:00 AM


Hi,

i have a txtfile like that =

bla1
foo=red

bla2
foo=green

bla3
foo=yellow

and i want to get i.e. bla1 and the corresponding value of foo

i tried with

File.open("Y:/test/sample.txt", "r").each do |line|
puts $1<<' : '<< $3 if line =~ /(\w+)\s+(\w+=)(\w+)/
end

but somehow the regex doesn't work ?!
whereas it works in the QuickRex Plugin for Eclipse

Any ideas ?

Regards, Gilbert

6 Answers

Robert Klemme

2/23/2007 8:15:00 AM

0

On 23.02.2007 08:36, Rebhan, Gilbert wrote:
> Hi,
>
> i have a txtfile like that =
>
> bla1
> foo=red
>
> bla2
> foo=green
>
> bla3
> foo=yellow
>
> and i want to get i.e. bla1 and the corresponding value of foo
>
> i tried with
>
> File.open("Y:/test/sample.txt", "r").each do |line|
> puts $1<<' : '<< $3 if line =~ /(\w+)\s+(\w+=)(\w+)/
> end
>
> but somehow the regex doesn't work ?!
> whereas it works in the QuickRex Plugin for Eclipse
>
> Any ideas ?

If this is really the case I'd say the QuickRex Plugin is broken or you
feed different files. Since you match for a non zero number of white
space characters before the equal sign, it should not match, since there
is none in the file contents you showed. You could change to \s* or
leave it out completely.

Kind regards

robert

Rebhan, Gilbert

2/23/2007 9:00:00 AM

0


Hi,

-----Original Message-----
From: Robert Klemme [mailto:shortcutter@googlemail.com]
Sent: Friday, February 23, 2007 9:15 AM
To: ruby-talk ML
Subject: Re: File.open with line =~ /.../

On 23.02.2007 08:36, Rebhan, Gilbert wrote:
> Hi,
>
> i have a txtfile like that =
>
> bla1
> foo=red
>
> bla2
> foo=green
>
> bla3
> foo=yellow
>
> and i want to get i.e. bla1 and the corresponding value of foo
>
> i tried with
>
> File.open("Y:/test/sample.txt", "r").each do |line|
> puts $1<<' : '<< $3 if line =~ /(\w+)\s+(\w+=)(\w+)/
> end
>
> but somehow the regex doesn't work ?!
> whereas it works in the QuickRex Plugin for Eclipse
>
> Any ideas ?

/*
If this is really the case I'd say the QuickRex Plugin is broken or you
feed different files. Since you match for a non zero number of white
space characters before the equal sign, it should not match, since there

is none in the file contents you showed. You could change to \s* or
leave it out completely.
*/

hmm, the QuickRex Plugin can evaluate with the Regular Expression
Implementation for =

Java
Jakarta Oro Perl 5
Jakarta Oro Awk
JRegex


the regex
(\w+)\r\n(\w+=)(\w+) works in all implementations except the Awk
also the regex (\w+)\s+(\w+=)(\w+) works for all except the Awk
implementation

so i get = $1 > bla1 $2 >foo $3 > red with both regex

Did only simple regex operations on one line in ruby until now.
What's wrong with my regex ?

Regards, Gilbert

Carlos

2/23/2007 9:46:00 AM

0

Rebhan, Gilbert wrote:
> Hi,
>
> i have a txtfile like that =
>
> bla1
> foo=red
>
> bla2
> foo=green
>
> bla3
> foo=yellow
>
> and i want to get i.e. bla1 and the corresponding value of foo
>
> i tried with
>
> File.open("Y:/test/sample.txt", "r").each do |line|
> puts $1<<' : '<< $3 if line =~ /(\w+)\s+(\w+=)(\w+)/
> end
>
> but somehow the regex doesn't work ?!
> whereas it works in the QuickRex Plugin for Eclipse

Well... for each line of the file you are trying to match 2 lines.
That's impossible :). Read the file in "paragraph mode" and match each
paragraph, or read it whole and scan it for your regexp.

For example (not tested):

File.read('...').scan(/^(\w+)\s*\n\w+=(\w+)$/) {|a,b| puts a+": "+b}

Good luck.
--



Rebhan, Gilbert

2/23/2007 10:21:00 AM

0



Hi,

-----Original Message-----
From: Carlos [mailto:angus@quovadis.com.ar]
Sent: Friday, February 23, 2007 10:46 AM
To: ruby-talk ML
Subject: Re: File.open with line =~ /.../

> i tried with
>
> File.open("Y:/test/sample.txt", "r").each do |line|
> puts $1<<' : '<< $3 if line =~ /(\w+)\s+(\w+=)(\w+)/
> end
>
> but somehow the regex doesn't work ?!
> whereas it works in the QuickRex Plugin for Eclipse

/*
Well... for each line of the file you are trying to match 2 lines.
That's impossible :). Read the file in "paragraph mode" and match each
paragraph, or read it whole and scan it for your regexp.
*

Strike, ouch ;-)
yup line != lines

/*
For example (not tested):

File.read('...').scan(/^(\w+)\s*\n\w+=(\w+)$/) {|a,b| puts a+": "+b}
*/

works like a charm. Thanks !!


Regards, Gilbert



Brian Candler

2/23/2007 11:01:00 AM

0

On Fri, Feb 23, 2007 at 04:36:05PM +0900, Rebhan, Gilbert wrote:
>
> Hi,
>
> i have a txtfile like that =
>
> bla1
> foo=red
>
> bla2
> foo=green
>
> bla3
> foo=yellow
>
> and i want to get i.e. bla1 and the corresponding value of foo
>
> i tried with
>
> File.open("Y:/test/sample.txt", "r").each do |line|
> puts $1<<' : '<< $3 if line =~ /(\w+)\s+(\w+=)(\w+)/
> end
>
> but somehow the regex doesn't work ?!
> whereas it works in the QuickRex Plugin for Eclipse
>
> Any ideas ?

It's because you're only searching within each line individually, whereas
your regexp matches ( word, space, word=word ) in one go. Using 'each' it
will be invoked first with "bla1\n" and then with "foo=red\n", neither of
which matches by itself.

If it's a small file then just slurp it in all in one go:

ans = File.open("sample.txt").read.scan(/(\w+)\s+(\w+=)(\w+)/)
p ans

Your regexp works, but personally I would add some anchors, i.e.

ans = File.open("sample.txt").read.scan(/^(\w+)\s+(\w+=)(\w+)$/)
p ans

If you want to avoid reading the whole file in, there are more complex
solutions, e.g.

require 'enumerator'
ans = File.open("sample.txt").each_cons(2) do |line1, line2|
next unless line1 =~ /^(\w+)$/
cat = $1
next unless line2 =~ /^(\w+)=(\w+)$/
puts "#{cat}: #{$1} => #{$2}"
end

HTH,

Brian.

Robert Klemme

2/23/2007 1:35:00 PM

0

On 23.02.2007 09:59, Rebhan, Gilbert wrote:
>
> Hi,
>
> -----Original Message-----
> From: Robert Klemme [mailto:shortcutter@googlemail.com]
> Sent: Friday, February 23, 2007 9:15 AM
> To: ruby-talk ML
> Subject: Re: File.open with line =~ /.../
>
> On 23.02.2007 08:36, Rebhan, Gilbert wrote:
>> Hi,
>>
>> i have a txtfile like that =
>>
>> bla1
>> foo=red
>>
>> bla2
>> foo=green
>>
>> bla3
>> foo=yellow
>>
>> and i want to get i.e. bla1 and the corresponding value of foo
>>
>> i tried with
>>
>> File.open("Y:/test/sample.txt", "r").each do |line|
>> puts $1<<' : '<< $3 if line =~ /(\w+)\s+(\w+=)(\w+)/
>> end
>>
>> but somehow the regex doesn't work ?!
>> whereas it works in the QuickRex Plugin for Eclipse
>>
>> Any ideas ?
>
> /*
> If this is really the case I'd say the QuickRex Plugin is broken or you
> feed different files. Since you match for a non zero number of white
> space characters before the equal sign, it should not match, since there
>
> is none in the file contents you showed. You could change to \s* or
> leave it out completely.
> */
>
> hmm, the QuickRex Plugin can evaluate with the Regular Expression
> Implementation for =
>
> Java
> Jakarta Oro Perl 5
> Jakarta Oro Awk
> JRegex
>
>
> the regex
> (\w+)\r\n(\w+=)(\w+) works in all implementations except the Awk
> also the regex (\w+)\s+(\w+=)(\w+) works for all except the Awk
> implementation
>
> so i get = $1 > bla1 $2 >foo $3 > red with both regex
>
> Did only simple regex operations on one line in ruby until now.
> What's wrong with my regex ?

Maybe I was too fast - I overlooked that you are trying to match
multiple lines. In that case of course you have to feed multiple lines
- not a single line at a time as Carlos pointed out.

Kind regards

robert