目前我找到的文件夹的搜索工具,最多可以完成把搜索到的单行的内容,进行输出出来,或者进行一些简单的处理,但是不够灵活。
因此就用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 |
唯一不满意的地方貌似是搜索速度有点慢,以后有空再调整吧,现在这个暂时够用了,至少比原来方便多了~~