I have a program that generates text fiels that can be up to 20 mets in size. Sometimes I only care about the last line in the file, is there a way to read just that line with out wasting memory reading the rest of the file?
+3
A:
I could be mistaken but without resorting to some trickery, it seems that you can't. However, if you have a rough estimate of the length of the lines, you can open a file and then seek from the end, say, 1Kb.
local f = io.open([[c:\test_file.txt]], "r")
local len = f:seek("end")
f:seek("set", len - 1024)
local text = f:read("*a")
print(string.match(text, "[^%c]*$"))
f:close()
Hope this helps. Take into account that the pattern needs some refinement. It currently assumes that no control characters appear on a line. If your line has i.e. tabs, then it will capture from there till the end of file.
Ignacio
2009-01-31 00:00:15
The two seek lines can easily be combined into one: f:seek("end", -1024)
David Hanak
2009-01-31 10:39:30
Thanks, I've missed that in the manual.
Ignacio
2009-01-31 14:56:32