LUA处理文本文件?急。
1.指定目录下有LOG2013-2-1、LOG2013-2-2、LOG2013-2-3.....按日期排列的日志文件。2.每条日志的格式为:[1234]AA:upMSGI...
1.指定目录下有 LOG2013-2-1、 LOG2013-2-2、 LOG2013-2-3.....按日期排列的日志文件。
2.每条日志的格式为:
[1234]
AA:up
MSGID:M264aaaa
PREMSGID:00000000
BB:19
CC:
DD:456
EE: xxooxooo123
DATAXXXX
[1235]
AA:up
......
每条指令固定为10行,其中[xxx]为递增的日志标号。
现在要做的就是,在日志中找出标号为[xxxx]的日志所在哪个文件的第多少行。
提示:日志很大,不用全轮询,只需判断出文件中第一条和最后一条的标号就知道[xxxx]是否在这个区间。
比较急,如果答案符合要求,再追加100分,说道做到 展开
2.每条日志的格式为:
[1234]
AA:up
MSGID:M264aaaa
PREMSGID:00000000
BB:19
CC:
DD:456
EE: xxooxooo123
DATAXXXX
[1235]
AA:up
......
每条指令固定为10行,其中[xxx]为递增的日志标号。
现在要做的就是,在日志中找出标号为[xxxx]的日志所在哪个文件的第多少行。
提示:日志很大,不用全轮询,只需判断出文件中第一条和最后一条的标号就知道[xxxx]是否在这个区间。
比较急,如果答案符合要求,再追加100分,说道做到 展开
1个回答
展开全部
function getline_lognum(file,num)
-- file is path ,exp : c:\a.txt
-- num is num , exp : 1233
numline="[" .. num .. "]" -- targed to [1233]
linenum=0
for i in io.lines(file)
do
linenum=linenum+1
if (i == numline ) then
return linenum
end
end
return -1
end
function main()
file='c:\\a.txt'
if (not io.open(file)) then
io.write("error ,failed to open file:c:\\a.txt")
return 1
end
while (1) do
num=io.read()
io.write("find on " .. getline_lognum(file,num) .. "\n")
end
end
main()
其中的 getline_lognum 是你需要的函数。它接受一个 路径,和一个数字。
你必须在log 文件开始处给出log文件所包含的区间的信息才能快速判断。否则只能遍历到文件最后一行,会导致效率低下。
-- file is path ,exp : c:\a.txt
-- num is num , exp : 1233
numline="[" .. num .. "]" -- targed to [1233]
linenum=0
for i in io.lines(file)
do
linenum=linenum+1
if (i == numline ) then
return linenum
end
end
return -1
end
function main()
file='c:\\a.txt'
if (not io.open(file)) then
io.write("error ,failed to open file:c:\\a.txt")
return 1
end
while (1) do
num=io.read()
io.write("find on " .. getline_lognum(file,num) .. "\n")
end
end
main()
其中的 getline_lognum 是你需要的函数。它接受一个 路径,和一个数字。
你必须在log 文件开始处给出log文件所包含的区间的信息才能快速判断。否则只能遍历到文件最后一行,会导致效率低下。
追问
英雄,我想到一个好办法你帮我实现一下,一百多分都给你,: 因为日志是按日期增长的,所以可以使用日志1的头和日志2的头当区间,同理往下推。。。。哈哈,
追答
require "lfs"
function getline_lognum(file,num)
-- file is path ,exp : c:\a.txt
-- num is num , exp : 1234
local numline='^%s*%[' .. num .. '%]%s*$' --exp: regexp : %s*\[1234\]%s* ,首尾部忽略空格
local linenum=0
for i in io.lines(file) do
--print("",i ,numline )
linenum=linenum+1
if (string.match(i, numline)) then --numline
return linenum
end
end
return -1
end
function read_1st_line(file)
-- 文件返回第一行,并且去除[ ]
local i
for i in io.lines(file) do
if (string.match(i,"%s+")) then --略过空白行
else
return string.match(i,"(%d+)")
end
end
end
function index_tab(dir)
-- 返回指定文件夹内符合 LOG日期 格式的文件名列表,并且包含文件第一个索引。
local logfiles={}
for i in lfs.dir(dir) do
if (string.match(i , "^LOG%d+[-]%d+[-]%d+")) then
table.insert(logfiles, {i,read_1st_line(i) })
end
end
table.sort(logfiles,
function (a,b)
return a[2] >b[2]
end
)
return logfiles
end
function main()
local logfiles=index_tab("c:/")
-- search c:/ directory
local i,v,n
while (1) do
io.write(">")
num=io.read()
n=-1
for i,v in ipairs(logfiles) do
if (num >= v[2]) then
n=getline_lognum(v[1],num)
if (n ~= -1 ) then
print(v[1] .. " : " .. n)
break
end
end
end
if( n== -1) then
print("Not found!")
end
end
end
main()
正确运行需要把当前文件夹定位到 LOG 文件所在文件夹。注意采纳哈。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询