如何只读取Lua中文本文件的最后一行?

时间:2009-01-30 21:26:43

标签: file lua io

我有一个程序可以生成最大20米的文本文件。有时候我只关心文件的最后一行,有没有办法只读取那行而不浪费内存读取文件的其余部分?

2 个答案:

答案 0 :(得分:3)

我可能弄错了,但没有诉诸一些诡计,似乎你做不到。 但是,如果您粗略估计线条的长度,则可以打开文件,然后从最后搜索,例如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标签,那么它将从那里捕获,直到文件结束。

答案 1 :(得分: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