目前我找到的文件夹的搜索工具,最多可以完成把搜索到的单行的内容,进行输出出来,或者进行一些简单的处理,但是不够灵活。
因此就用lua自己写了个,可以完成自己定义搜索处理函数,进行一些数据的处理,省去了将搜索结果放到excel中再处理的过程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
-- search_log.lua
tbResult = {};
tbCmdResult = {};
local szTmpFolderPath = os. getenv ( "temp" );
if not szTmpFolderPath then
os.execute( "md c:\\temp" )
szTmpFolderPath = "c:\\temp" ;
end
local tbSpecialWorld =
{
[ "(" ] = "%(" , [ ")" ] = "%)" , [ "." ] = "%." , [ "%" ] = "%%" ,
[ "+" ] = "%+" , [ "-" ] = "%-" , [ "*" ] = "%*" , [ "?" ] = "%?" ,
[ "[" ] = "%[" , [ "]" ] = "%]" , [ "^" ] = "%^" , [ "$" ] = "%$" ,
};
function FormatCmd(szCmd)
return string.gsub(szCmd, "." , function(s) return tbSpecialWorld[s] or s; end)
end
function FormatPath(szPath)
string.gsub(szPath, "[\\/]$" , "" );
return string.gsub(szPath, "/" , "\\" );
end
function CheckFile(szFilePath)
local file = io.open(szFilePath, "rb" );
if not file then
return ;
end
file:close();
return true ;
end
function OpenFile(szFilePath)
if not CheckFile(szFilePath) then
return ;
end
local tbFile = {};
for line in io.lines(szFilePath) do
table.insert(tbFile, line);
end
return tbFile;
end
function SearchFile(szFilePath, szCmd, fnCmd2Line, fnFileName)
local tbFile = OpenFile(szFilePath);
if not tbFile then
return ;
end
tbResult[szFilePath] = tbResult[szFilePath] or {};
local szCmdResult = "" ;
for nLine, szLine in ipairs(tbFile) do
if string.match(szLine, szCmd) then
szCmdResult = fnCmd2Line(szLine);
if szCmdResult and szCmdResult ~= "" then
table.insert(tbCmdResult, szCmdResult);
end
table.insert(tbResult[szFilePath], nLine .. ":" .. szLine);
end
end
return 1;
end
function Cmd2Line(szLine)
return ;
end
function CheckName(szFileName)
return true ;
end
function SearchDir(szFolderPath, szCmd, fnCmd2Line, fnCheckName, nIdx)
if not szCmd or szCmd == "" then
return ;
end
local fnCmd2Line = fnCmd2Line or Cmd2Line;
local fnCheckName = fnCheckName or CheckName;
local nIdx = nIdx or 0;
local szTmpFileName = szTmpFolderPath .. "\\SearchDirTemp" .. nIdx .. ".tmp" ;
os.execute( "dir /b " .. szFolderPath .. " >" .. szTmpFileName);
local tbFile = OpenFile(szTmpFileName);
if not tbFile or #tbFile == 0 then
return ;
end
local szPath = "" ;
for _, szFileName in ipairs(tbFile) do
szPath = szFolderPath .. "\\" .. szFileName;
if not CheckFile(szPath) then
SearchDir(szPath, szCmd, fnCmd2Line, nIdx + 1);
else
if CheckName(szFileName) then
SearchFile(szPath, szCmd, fnCmd2Line);
end
end
end
end
function Write2File(szInfo, szFilePath)
local file = io.open(szFilePath, "w" );
if not file then
print(szInfo);
print( "Write2File ERR ?? not file " .. szFilePath);
return ;
end
file:write(szInfo);
file:close();
end
function DoSearchDir(szFolderPath, szCmd, tbParam)
if not szFolderPath or szFolderPath == "" or not szCmd or szCmd == "" then
return ;
end
tbParam = tbParam or {};
szFolderPath = FormatPath(szFolderPath);
if tbParam.bIsMatch then
szCmd = FormatCmd(szCmd);
end
local nTime = os. time ();
SearchDir(szFolderPath, szCmd, tbParam.fnCmd2Line or Cmd2Line, tbParam.fnCheckName or CheckName, 0);
nTime = os. time () - nTime;
print( "搜索用时:" .. nTime);
local szResultPath = tbParam.szResultPath or (szTmpFolderPath .. "\\result.tab.tmp" );
local szResult = "" ;
for szFilePath, tbInfo in pairs(tbResult) do
szResult = szResult .. szFilePath .. "\n" ;
for _, szLine in pairs(tbInfo) do
szResult = szResult .. szLine .. "\n" ;
end
end
Write2File(szResult, szResultPath);
local szCmdResult = "" ;
for _, szLine in pairs(tbCmdResult) do
szCmdResult = szCmdResult .. szLine .. "\n" ;
end
Write2File(szCmdResult, tbParam.szCmdResultPath or (szTmpFolderPath .. "\\cmd_result.tab.tmp" ));
end
--tbParam =
--{
-- bIsMatch = false ; -- 是否使用正则方式搜索
-- fnCmd2Line = function () end; -- 自定义搜索行内容处理函数
-- fnCheckName = function () end; -- 文件名限定函数
-- szResultPath = "e:\\result.tab" ; -- 文件搜索内容输出路径
-- szCmdResultPath = "e:\\cmd_result.tab" ; -- 自定义处理函数返回内容储存路径
--}
|
使用代码可以如下(貌似支持网络路径的):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
dofile( "e:\\search_log.lua" );
tbTmpInfo = {};
function CheckInfo(szLine)
local szPlayerName, nPlayerId, nCount = string.match(szLine, "^.*szType = final\t[^\t]+\t%d+\t([^\t]+)\t(%d+)\t(%d+).*$" );
nPlayerId = tonumber(nPlayerId);
nCount = tonumber(nCount);
if nCount > tbTmpInfo[nPlayerId] then
tbTmpInfo[nPlayerId] = nCount;
return "" .. nPlayerId .. "\t" .. nCount;
end
return ;
end
tbParam =
{
bIsMatch = false ;
fnCmd2Line = CheckInfo;
fnCheckName = function () return true ; end;
szResultPath = "e:\\result.tab" ;
szCmdResultPath = "e:\\cmd_result.tab" ;
}
DoSearchDir( "d:\\logs" , "szType = final" , tbParam);
for _, szInfo in pairs(tbTmpInfo) do
print(szInfo);
end
|
唯一不满意的地方貌似是搜索速度有点慢,以后有空再调整吧,现在这个暂时够用了,至少比原来方便多了~~