在Lua中处理CR行尾符

我试图使用 file:read 方法读取一个包含 CR 行尾的文件,但它似乎出了一些问题。文件内容如下:

ABCDEFGH
12345
##
6789

我希望它能够在所有类型的行尾结束符下表现一致。每次我尝试读取文件时,它返回文件中的最后一行,加上来自上一行的任何尾随字符,这些字符的位置比最后一行的最后一个字符的位置更大。这就是我的意思:

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

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

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

>

正如您所看到的,返回的字符串是最后一行加上前一行的 5 以及第一行的 FGH。任何长度小于最后一行的行将被跳过。

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

点赞
用户828255
用户828255

你可以使用 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
2013-12-15 20:40:16
用户204011
用户204011

在只有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
2013-12-15 21:09:43