【问题标题】:Handling CR line endings in Lua在 Lua 中处理 CR 行结尾
【发布时间】:2013-12-15 19:45:06
【问题描述】:

我正在尝试使用 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) -- 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()

【问题讨论】:

  • 尝试以文本模式打开文件:将rb更改为r
  • 它仍然给我相同的结果。功能不是问题,它是 REPL(见 catwell 的回答)。
  • 对不起,也不是repl,而是我对回车符的理解。

标签: file lua line-endings


【解决方案1】:

在仅使用 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

【讨论】:

  • 将它放在一个字符串中会使它更加混乱。如果它从字符串中的'A' 开始向'9' 移动,如果如您所说,CR 将其返回到行首,它不会卡在一个非结束循环中吗?
  • 我不明白你的“非结束循环”问题。它从左到右读取字符串并准确地返回到行首三遍(字符串中\r 字符的数量)。需要明确的是:它返回到 输出 中的行首,而不是它正在显示的字符串中。
  • 我已经编辑了我的答案并添加了一个“逐字符示例”,也许它会更清楚。
【解决方案2】:

您可以使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多