I’m creating some basic work assistance utilities using Ruby. I’ve hit a problem that I don’t really need to solve, but curiosity has the best of me.
What I would like to be able to do is search the contents of a file, starting from a particular line and find the first PREVIOUS occurrence of a string.
For example, if I have the following text saved in a file, I would like to be able to search for “CREATE PROCEDURE” starting at line 4 and have this return/output “CREATE PROCEDURE sp_MERGE_TABLE”
CREATE PROCEDURE sp_MERGE_TABLE
AS
SOME HORRIBLE STATEMENT
HERE
CREATE PROCEDURE sp_SOMETHING_ELSE
AS
A DIFFERENT STATEMENT
HERE
Searching for content isn’t a challenge, but specifying a starting line – no idea. And then searching backwards… well…
Any help at all appreciated!
TIA!
Edit:
I just had a much better idea, but I’m going to include the old solution anyway.
The benefit of searching backwards means you only have to read the first chunk of the file, upto the specified line number. For proximity, you get closer and closer to the start_line, and if you find a match you just forget the old one.. You still read in some redundant data at the beginning, but at least it’s O(n)
Of course, bear in mind that the size of this file plays an important role in answering your question.
If you wanted to get really serious, you could look into the
IOclass – it seems like this might be the ultimate solution. Untested, just a thought.Original:
For an exhaustive solution, you could try something like the following. The downside is you’d need to read the whole file into memory, but it takes into account continuing from the bottom-up if it gets to the top without a match. Untested.