处理Lua中的CR行结尾

时间:2013-12-15 19:45:06

标签: file lua line-endings

我正在尝试使用CR方法读取带有file:read行结尾的文件,该方法似乎由于某种原因而起作用。文件内容如下所示:

ABCDEFGH
12345
##
6789

我希望它与所有类型的行结尾一致。每次我尝试读取文件时,它都会返回文件中的最后一行与前一行中任何尾随字符的连接,这些字符的位置大于最后一行中最后一个字符的位置。这就是我的意思:

> file=io.open("test.lua", "rb")
> function re_read(openFile)
     openFile:seek("set");
     return openFile:read("*a");
  end
> =re_read(file) -- With CR
67895FGH

> =re_read(file) -- With CRLF
ABCDEFGH
12345
##
6789

> =re_read(file) -- with LF
ABCDEFGH
12345
##
6789

>

正如您所看到的,返回的字符串是前一行中的最后一个字符串加5,并且是第一行的FGH加上file:line()。将跳过任何比最后一行短的行。

我的目标是使用file:read方法逐行读取文件。我希望如果找到file:lines()的“修正”,则可以将其应用于{{1}}。

2 个答案:

答案 0 :(得分:6)

在仅CR的情况下,re_read实际上按预期工作:它返回由CR分隔的行。但是当解释器显示它时,它将CR字符解释为“返回到行的开头”。所以这里是结果如何逐行改变:

ABCDEFGH
12345FGH
##345FGH
67895FGH

编辑:这里是逐个字符,带有“虚拟光标”(|)。

|
A|
AB|
ABC|
ABCD|
ABCDEF|
ABCDEFGH|
|ABCDEFGH
1|BCDEFGH
12|CDEFGH
123|DEFGH
1234|EFGH
12345|FGH
|12345FGH
#|2345FGH
##|345FGH
|##345FGH
6|#345FGH
67|345FGH
678|45FGH
6789|5FGH

证明:

> s = "ABCDEFGH\r12345\r##\r6789"
> =s
67895FGH

答案 1 :(得分:3)

您可以使用gsub对行结尾进行规范化,然后使用gmatch对产品进行迭代。

local function cr_lines(s)
    return s:gsub('\r\n?', '\n'):gmatch('(.-)\n')
end

local function cr_file_lines(filename)
    local f = io.open(filename, 'rb')
    local s = f:read('*a')
    f:close()
    return cr_lines(s)
end

for ln in cr_file_lines('test.txt') do
    print(ln)
end