我很难找出问题所在: 我应该使用lua从文本文件中读取行,并打印包含字符串“ login”或“ logout”的所述行-如果到达文件末尾,则进行打印(“到达文件末尾”)。 由于某种原因,第一行(我认为)正在接收nil值,因此我被卡住了... 我会提到我正在使用从脚本编写的确切文件夹中的cmd运行lua代码
lua code:
file = io.open("dummy_log.txt", "r")
line = file:read()
while true do
print("first line is: "..line)
if line == nil then
print("reached end of file")
break
else
if string.match(line, "login") then
print("reached login line: " .. line)
elseif string.match(line, "logout") then
print("reached logout line: " .. line)
end
end
line = file:read()
end
file:close()
log file:
13:20:20 [111] log-in
13:22:00 [111] deposit
13:22:01 [111] phone-call
13:50:50 [111] log-out
(is written in a text file).
我们将不胜感激...
答案 0 :(得分:1)
最简单的解决方法是:
替换:while true do
使用:while line do
在检查“行”是否为零之前,请记住您有print("first line is: "..line)
。
您实际上不希望print("first line is: "..line)
进入循环,因为它将声称每一行都是第一行。
file = io.open("dummy_log.txt", "r")
line = file:read()
print("first line is: "..line)
while line do
if string.find(line, "log%-in") then
print("reached login line: " .. line)
elseif string.find(line, "log%-out") then
print("reached logout line: " .. line)
end
line = file:read()
end
file:close()
答案 1 :(得分:1)
您不需要while循环即可读取文件行。
您可以将generic for loop与file:lines一起使用
在该循环line
中将永远不会是nil
。因此,您不必手动检查它。
local file = io.open("dummy_log.txt", "r")
for line in file:lines() do
if line:find("log%-in") then
print("reached login line: " .. line)
elseif line:find("log%-out") then
print("reached logout line: " .. line)
end
end
print("end of file")
file:close()
答案 2 :(得分:0)
就像@Alundaio said一样,即使每行都是nil
,您也将其打印为“第一行”。 while line do
会更整洁。
但是最重要的是,您永远不会匹配log-in
和log-out
,因为您正在搜索login
和logout
(不带破折号)。
您可能要考虑可选的短划线:log%-?in
,log%-?out
,按照@Alundaio的建议使用特殊字符文字语法,或者使用log[-]?in
,log[-]?out
在破折号上使用字符类语法。
根据@Alundaio的回答,如果您想假设破折号始终存在,请使用log%-in
/ log%-out
或log[-]in
/ log[-]out
。