find string, get line number or position, then restart at +1

D

Derek Smith

Hi All,

First off I want to say this list is very helpful and people are nice
and polite compared to many other email lists and forums I have been on
for years and years, notably the camel lists. Thank you!


Ok so I have a file where I am searching for the string "Jul 14.*" for
example using a regexp and this is working fine. However I have been
debating on how to move forward with what code, $. or tell with seek?

for each line in file
linenumber = $. if /^string/
end

for each line in file
linenumber = tell line if /^string/
end

Will either of the above pseudo-code work?

seek to linenumber and add 1
start re-reading at linenumber+1 and store data until EOF.

Please help and or provide sample code?

thank you
 
D

Dylan

Hi All,

First off I want to say this list is very helpful and people are nice
and polite compared to many other email lists and forums I have been on
for years and years, notably the camel lists. Thank you!

Ok so I have a file where I am searching for the string "Jul 14.*" for
example using a regexp and this is working fine.  However I have been
debating on how to move forward with what code, $. or tell with seek?

for each line in file
   linenumber = $. if /^string/
end

for each line in file
   linenumber = tell line if /^string/
end

Will either of the above pseudo-code work?

seek to linenumber and add 1
start re-reading at linenumber+1 and store data until EOF.

Please help and or provide sample code?

thank you

I'm not sure I'm understanding your question right, but it sounds like
you want all the data in a file after "Jul 14"? If so there's no need
to traverse through and then seek. Try something like this:

regex = /^Jul 14/
found = false
data = Array.new()
file = File.open("file","r")
file.each{|line|
data << line if(found)
found = true if(line =~ regex)
}
puts data.join("\n")

This will put everything after the line starting with "Jul 14" into an
array delineated by lines. Then you can do whatever you want with it.
If you wanted to alter it so it grabs the data between two different
regexes just add another if(line =~ regex2) line and change found to
false. Hope this helps!

-Dylan
 
D

Derek Smith

7stud said:

Huh!
: )

Goal is to find pattern in file, note line number in same file, discard
all prior lines while storing all proceeding lines after pattern was
found?

I have the regexp working and the store working to a table, however
getting the syntax correct for the "start at linenumber +1 from pattern
was found" is evading me.

for each line in file
linenumber = $. if /^string/
end

for each line in file
linenumber = tell line if /^string/
end

Will either of the above pseudo-code work?

seek to linenumber and add 1
start re-reading at linenumber+1 and store data until EOF.
 
7

7stud --

Dylan said:
regex = /^Jul 14/
found = false
data = Array.new()
file = File.open("file","r")
file.each{|line|
data << line if(found)
found = true if(line =~ regex)
}
puts data.join("\n")

That man is a genius. :)
 
R

Rob Biedenharn

Huh!
: )

Goal is to find pattern in file, note line number in same file,
discard
all prior lines while storing all proceeding lines after pattern was
found?

OK, starting from just this, I'd say:

re = /^Jul 14/
lines = []
File.open(filename) do |file|
until file.eof?
break if file.gets =~ re
end

until file.eof?
lines << file.gets
end
end

# ... do something with lines
I have the regexp working and the store working to a table, however
getting the syntax correct for the "start at linenumber +1 from
pattern
was found" is evading me.

for each line in file
linenumber = $. if /^string/
end

for each line in file
linenumber = tell line if /^string/
end

Will either of the above pseudo-code work?

seek to linenumber and add 1
start re-reading at linenumber+1 and store data until EOF.
--

I don't know why you'd want to seek or re-read lines given your
parameters. Just the one pass is enough. Of course, if you can
operate on each line inside the second inner loop, you don't even need
to accumulate them into the lines array.

-Rob

Rob Biedenharn http://agileconsultingllc.com
(e-mail address removed)
+1 513-295-4739
Skype: rob.biedenharn
 
E

Eric Hodel

Ok so I have a file where I am searching for the string "Jul 14.*" for
example using a regexp and this is working fine. However I have been
debating on how to move forward with what code, $. or tell with seek?

If it's a small file, use StringScanner:

require 'strscan'

text = File.read the_file
scanner = StringScanner.new text
scanner.scan /Jul 14/

# ...

ri StringScanner for details.
 
D

Derek Smith

Eric said:
If it's a small file, use StringScanner:

require 'strscan'

text = File.read the_file
scanner = StringScanner.new text
scanner.scan /Jul 14/

# ...

ri StringScanner for details.


Thank you all for your replies!
I understand all of them!
Derek
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,599
Members
45,175
Latest member
Vinay Kumar_ Nevatia
Top