我有一个程序可以生成最大为 20 米的文本字段。有时我只关心文件中的最后一行,有没有办法只读取该行而不浪费内存读取文件的其余部分?
Jared
问问题
4538 次
2 回答
4
我可能会弄错,但如果不诉诸诡计,似乎你不能。但是,如果您对行的长度有一个粗略的估计,您可以打开一个文件,然后从末尾开始查找,例如 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()
希望这可以帮助。考虑到该模式需要一些改进。它目前假定一行上没有出现控制字符。如果您的行有 ie 选项卡,那么它将从那里捕获到文件末尾。
于 2009-01-31T00:00:15.743 回答
0
我不确定这对于包含非常大行的文件会如何表现,因为它会进行大量f:read(1)
调用。我还添加了一个可选参数来读取不止一行。
-- assumes file ends with line break
function lastline(path, how_many)
how_many = (how_many) or 1
how_many = how_many + 1
local f = assert(io.open(path))
local new_lines_found = 0
-- needs to find at least a pair of \n
local len = f:seek("end")
for back_by=1, len do
f:seek("end", -back_by)
if f:read(1) == '\n' then
new_lines_found = new_lines_found + 1
if new_lines_found == how_many then
local last_lines = f:read("a")
io.write(last_lines)
return
end
end
end
f:close()
end
于 2020-12-09T13:02:21.257 回答