[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

How to find second match in a file

Cheyne Li

6/25/2008 9:53:00 PM

Hi, everyone

My code opens a file and read line by line to find a given string as
first match. After I found one, how can i find the second match, a
different string, which is supposed to appear several lines after the
line of first match in a fast way?

for example, the following is the contents of a file

ka;sdfjaskf;asdfjk
skdfkfkfkfkfkfkfkfkfk
aks;flasjklfjkassjfksa
aaaaaaaaaaaaaaaaaaaaaaaa
bbbbbasdfdask;fjsdkalf
*************hello world***************ka;sdjkf;sjadkfj
asdfkasjdkfldjaskl;jfklas;
jaskdl;fjkasdjkfljdskla;jdfs
jkasl;jfkasjdklfjsal;df
asjkdfjkasd;fd;asdfj
***********Ruby*********a;sjdfklsdjal;fjkda;
asdfjjasklfjkdasjkfjaskl;
fjdka;dfdjasjfsd;a

So, after I found the match "hello world" by using a while loop, how can
i find the "Ruby" in the same while loop?

Looking forward to your reply. Thanks in advance
--
Posted via http://www.ruby-....

2 Answers

Rodrigo Bermejo

6/26/2008 12:43:00 AM

0

Cheyne Li wrote:
> Hi, everyone
>
> My code opens a file and read line by line to find a given string as
> first match. After I found one, how can i find the second match, a
> different string, which is supposed to appear several lines after the
> line of first match in a fast way?
>
> for example, the following is the contents of a file
>
> ka;sdfjaskf;asdfjk
> skdfkfkfkfkfkfkfkfkfk
> aks;flasjklfjkassjfksa
> aaaaaaaaaaaaaaaaaaaaaaaa
> bbbbbasdfdask;fjsdkalf
> *************hello world***************ka;sdjkf;sjadkfj
> asdfkasjdkfldjaskl;jfklas;
> jaskdl;fjkasdjkfljdskla;jdfs
> jkasl;jfkasjdklfjsal;df
> asjkdfjkasd;fd;asdfj
> ***********Ruby*********a;sjdfklsdjal;fjkda;
> asdfjjasklfjkdasjkfjaskl;
> fjdka;dfdjasjfsd;a
>
> So, after I found the match "hello world" by using a while loop, how can
> i find the "Ruby" in the same while loop?
>
> Looking forward to your reply. Thanks in advance
Not sure why you need it ...but seems you can do what you need by simple
doing this:
File.readlines("1.txt").each do |line|
if line =~ /hello world/
#do something
p line
end
if line =~ /Ruby/
#do something else
p line
end
end


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

Robert Klemme

6/26/2008 12:44:00 PM

0

2008/6/25 Cheyne Li <happy.go.lucky.clr@gmail.com>:
> Hi, everyone
>
> My code opens a file and read line by line to find a given string as
> first match. After I found one, how can i find the second match, a
> different string, which is supposed to appear several lines after the
> line of first match in a fast way?
>
> for example, the following is the contents of a file
>
> ka;sdfjaskf;asdfjk
> skdfkfkfkfkfkfkfkfkfk
> aks;flasjklfjkassjfksa
> aaaaaaaaaaaaaaaaaaaaaaaa
> bbbbbasdfdask;fjsdkalf
> *************hello world***************ka;sdjkf;sjadkfj
> asdfkasjdkfldjaskl;jfklas;
> jaskdl;fjkasdjkfljdskla;jdfs
> jkasl;jfkasjdklfjsal;df
> asjkdfjkasd;fd;asdfj
> ***********Ruby*********a;sjdfklsdjal;fjkda;
> asdfjjasklfjkdasjkfjaskl;
> fjdka;dfdjasjfsd;a
>
> So, after I found the match "hello world" by using a while loop, how can
> i find the "Ruby" in the same while loop?

It's probably easiest if you store the state of your search somewhere.

state = :initial

File.foreach "foo" do |line|
case state
when :initial
if /first/ =~ line
puts line
state = :first_match
end
when :first_match
if /second/ =~ line
puts line
state = :second_match
end
else
# ignore
end
end

Cheers

robert


--
use.inject do |as, often| as.you_can - without end