cocoapods-bb-PodAssistant 0.3.8.0 → 0.3.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,381 @@
1
+ require 'fileutils'
2
+ require 'pathname'
3
+ require 'find'
4
+ require 'spreadsheet'
5
+ module BBItools
6
+ # ---------------------------------ObjectFile class---------------------------------
7
+ class ObjectFile
8
+ # file_size:单个文件的大小
9
+ # o_name:某个文件的名字
10
+ # o_size: 某个o文件的大小
11
+ attr_accessor :serial_number, :file_path, :file_name, :file_size, :o_name, :o_size
12
+ def initialize()
13
+ @serial_number = []
14
+ @file_size = 0
15
+ @o_size = 0
16
+ end
17
+
18
+ end
19
+ # ---------------------------------Sections class---------------------------------
20
+ class Sections
21
+ attr_accessor :address, :size, :segment, :section
22
+
23
+ end
24
+ # ---------------------------------Symbols class---------------------------------
25
+ class Symbols
26
+ attr_accessor :s_address, :s_size, :s_file_serial_number, :s_name
27
+ def initialize
28
+ @s_file_serial_number = -1 #防止为0
29
+ end
30
+ end
31
+
32
+ # ---------------------------------DSSymbols class---------------------------------
33
+ class DSSymbols
34
+ attr_accessor :size, :file, :name
35
+ end
36
+
37
+ # ---------------------------------LinkMap class---------------------------------
38
+ class LinkMap
39
+ # 包含的属性
40
+ attr_accessor :l_name, :l_path, :l_arch, :l_obj_files, :l_sections, :l_symbols, :l_dead_stripped_symbols, :l_sym_map
41
+ # 初始化方法
42
+ def initialize(fName)
43
+ @l_name = fName
44
+ @l_obj_files = []
45
+ @l_symbols = []
46
+ @l_sections = []
47
+ @l_dead_stripped_symbols = []
48
+ end
49
+ # 得到path
50
+ def get_path(str)
51
+ splitparam = str.split(" ")
52
+ @l_path = splitparam.last
53
+ end
54
+ # 处理object文件
55
+ def handle_ojbect_files(str)
56
+ tempSplit = str.split("]")
57
+ if tempSplit.size > 1
58
+ obj_file = ObjectFile.new
59
+ obj_file.serial_number = tempSplit[0].delete("[").strip.to_i #设置serial_number
60
+ obj_file.file_path = tempSplit[1].strip
61
+ obj_file.file_name = tempSplit[1].split("/").last.chomp
62
+ obj_file.o_name = get_o_name(tempSplit[1].split("/").last.chomp)
63
+ l_obj_files << obj_file
64
+ end
65
+ end
66
+ # 得到o_ame 有待优化,可以使用正则表达式处理TODO
67
+ def get_o_name(str)
68
+ temp_arr = str.split("(")
69
+ if temp_arr.size > 1
70
+ temp_arr[1].split(".o)")[0]
71
+ else
72
+ return temp_arr[0].split(".o")[0]
73
+ end
74
+ end
75
+ # 处理sections
76
+ def handle_sections(str)
77
+ sectionSplit = str.split(" ")
78
+ if sectionSplit.size == 4
79
+ section = Sections.new
80
+ section.address = sectionSplit[0]
81
+ section.size = sectionSplit[1]
82
+ section.segment = sectionSplit[2]
83
+ section.section = sectionSplit[3]
84
+ l_sections << section
85
+ end
86
+ end
87
+ # get arch
88
+ def get_arch(str)
89
+ splitparam = str.split(" ")
90
+ @l_arch = splitparam.last
91
+ end
92
+ # 处理Symbols
93
+ def handle_symbols(str)
94
+ # 字符编码产生的异常处理
95
+ begin
96
+ symbolsSplit = str.split("\t")
97
+ rescue => exception
98
+ return
99
+ end
100
+ if symbolsSplit.size > 2
101
+ symbol = Symbols.new
102
+ symbol.s_address = symbolsSplit[0]
103
+ symbol.s_size = symbolsSplit[1]
104
+ # 获取编号和名字
105
+ serial_name_str = symbolsSplit[2]
106
+ file_and_name_split = serial_name_str.split("]")
107
+ if file_and_name_split.size > 1
108
+ symbol.s_file_serial_number = file_and_name_split[0].delete("[").strip.to_i #设置文件编号
109
+ symbol.s_name = file_and_name_split[1]
110
+ end
111
+
112
+ l_symbols << symbol
113
+ else
114
+ end
115
+ end
116
+ # 处理symbols的数组,把symbols转换成hashmap
117
+ def handle_l_sym_map
118
+ @l_sym_map = @l_symbols.group_by(&:s_file_serial_number)
119
+ if @l_sym_map.include?(-1)
120
+ puts "移除无用元素"
121
+ @l_sym_map.delete(-1)
122
+ end
123
+ end
124
+ # 处理link map file
125
+ def handle_map
126
+ handle_method_name = ""
127
+ File.read(@l_name).each_line do |line|
128
+ if line[0] == "#"
129
+ if line.include?("Path:")
130
+ handle_method_name = "get_path"
131
+ puts "处理path..."
132
+ elsif line.include?("Arch:")
133
+ handle_method_name = "get_arch"
134
+ puts "处理Arch..."
135
+ elsif line.include?("Object files")
136
+ handle_method_name = "handle_ojbect_files"
137
+ puts "处理Object files..."
138
+ elsif line.include?("Sections")
139
+ handle_method_name = "handle_sections"
140
+ puts "处理Sections..."
141
+ elsif line.include?("Symbols:") #symbols:和Dead Stripped Symbols处理一样
142
+ # 这里不处理Dead Stripped Symbols
143
+ if line.delete('#').strip.include?("Dead Stripped Symbols")
144
+ puts "不处理处理#{line.delete('#').strip}..."
145
+ break
146
+ end
147
+ puts "处理#{line.delete('#').strip}..."
148
+ handle_method_name = "handle_symbols"
149
+ end
150
+ end
151
+ self.send(handle_method_name, line)
152
+
153
+ end
154
+ end
155
+ # 对linkmap进行解析,然后输出结果
156
+ def self.parser(path_para)
157
+ start_time = Time.now.to_i #程序开始执行时间(以毫秒为单位)
158
+ # 获取link map file's name
159
+ link_map_file_name = path_para
160
+ puts "获取的文件路径为:#{link_map_file_name}"
161
+ if link_map_file_name.nil?
162
+ puts "请按照如下命令执行该脚本:"
163
+ puts "\033[31mItools parse **.txt \033[0m"
164
+ puts "**指代Link Map File的名字,例如LinkMapApp-LinkMap-normal-arm64.txt,parse后面为绝对路径"
165
+ return
166
+ end
167
+ if File.exist?(link_map_file_name)
168
+ puts "\033[32m获取LinkMap文件: #{link_map_file_name}成功,开始分析数据...\033[0m"
169
+ else
170
+ puts "\033[31m#{link_map_file_name}文件不存在,请重新输入文件 \033[0m"
171
+ return
172
+ end
173
+
174
+ link_map = LinkMap.new(link_map_file_name)
175
+ link_map.handle_map #处理文件为对象,然后继续后续操作
176
+ link_map.handle_l_sym_map #处理symbols为hashmap
177
+ sizeResultArr = []
178
+
179
+ link_map.l_obj_files.each do |obj|
180
+ temp_file_name = obj.file_name.split("(")[0]
181
+
182
+ last_file = sizeResultArr.last
183
+
184
+ if last_file && temp_file_name.eql?(last_file.file_name)
185
+ last_file.file_serial_numers << obj.serial_number
186
+ else
187
+ sz_obj = SizeResult.new
188
+ sz_obj.file_name = temp_file_name
189
+ sz_obj.file_serial_numers << obj.serial_number
190
+ sizeResultArr << sz_obj
191
+ end
192
+ end
193
+ data_analyze_time = Time.now.to_i
194
+ puts "\033[32m数据分析完成,耗时#{data_analyze_time - start_time}秒。开始计算结果\033[0m"
195
+
196
+ # 计算赋值size,此处耗时较长
197
+ total_size = 0
198
+ sizeResultArr.each do |obj|
199
+ # 处理方法2
200
+ obj.file_serial_numers.each do |s_number|
201
+ begin
202
+ link_map.l_sym_map[s_number].each do |symb|
203
+ obj.size = obj.size + symb.s_size.hex
204
+ total_size = total_size +symb.s_size.hex #统计总大小
205
+ end
206
+ rescue => exception
207
+ end
208
+ end
209
+ # 处理方法1 太过耗时
210
+ # link_map.l_symbols.each do |symb|
211
+ # if obj.file_serial_numers.include?(symb.s_file_serial_number)
212
+ # obj.size = obj.size + symb.s_size.hex
213
+ # end
214
+ # end
215
+ # puts "正在计算#{obj.file_name}的大小..."
216
+ end
217
+ data_handle_time = Time.now.to_i #处理数据时间
218
+ puts "\033[32m数据处理完成,耗时#{data_handle_time - data_analyze_time}秒。开始对结果进行大小排序(从大到小)...\033[0m"
219
+ # 按照从大到小排序
220
+ sizeResultArr.sort_by!{|obj|[-obj.size]}
221
+ sort_handle_time = Time.now.to_i #排序耗时
222
+ puts "\033[32m数据排序完成,耗时#{sort_handle_time - data_handle_time}秒。开始输出结果:\033[0m"
223
+ puts "\033[32m--------------------------------\033[0m"
224
+
225
+ # 判断文件是否存在
226
+ save_file_path = SizeResult.getSaveFileName(path_para)
227
+ if File.exist?(save_file_path)
228
+ File.delete(save_file_path)
229
+ end
230
+
231
+ # 创建要保存数据的文件
232
+ Spreadsheet.client_encoding = 'utf-8'
233
+ book = Spreadsheet::Workbook.new
234
+ sheet1 = book.create_worksheet
235
+ sheet1.row(0)[0] = "文件名"
236
+ sheet1.row(0)[1] = "文件大小(B)"
237
+ sheet1.row(0)[2] = "文件大小"
238
+ sizeResultArr.each_with_index{|item, idx|
239
+ sheet1.row(idx+1)[0] = item.file_name
240
+ sheet1.row(idx+1)[1] = item.size
241
+ sheet1.row(idx+1)[2] = SizeResult.handleSize(item.size)
242
+ puts "#{item.file_name} " + SizeResult.handleSize(item.size)
243
+ }
244
+ book.write "#{save_file_path}"
245
+ # save_file = File.new(save_file_path,"w+")
246
+ # # 打印结果
247
+ # sizeResultArr.each do |obj|
248
+ # puts "#{obj.file_name} " + SizeResult.handleSize(obj.size)
249
+ # save_file.puts("#{obj.file_name} #{SizeResult.handleSize(obj.size)}(#{obj.size})")
250
+ # end
251
+ # save_file.puts("总大小为:#{SizeResult.handleSize(total_size)}")
252
+ # save_file.close
253
+ puts "总大小为(仅供参考):#{SizeResult.handleSize(total_size)}"
254
+ puts "\033[32m--------------------------------\033[0m"
255
+ end_time = Time.now.to_i #程序执行结束时间
256
+ puts "分析结果已经保存为文件,位置为:\n\033[32m#{save_file_path}\033[0m"
257
+ puts " "
258
+ puts "\033[32m整个程序执行时间为:#{end_time - start_time}秒\033[0m"
259
+ end
260
+
261
+ # 根据linkmap && folder计算占用
262
+ # 第一个参数为linkmap路径,第二个参数为要分析的项目文件夹
263
+ def self.parser_by_folder(args)
264
+ link_map_file_name = args[0] #linkmap文件路径
265
+ project_folder = args[1] #项目文件夹
266
+ # 对参数进行校验
267
+ if File::directory?(project_folder)
268
+ puts "获取的项目目录路径为:#{project_folder}"
269
+ else
270
+ puts "\033[31m#{project_folder}文件夹不存在,请重新输入 \033[0m"
271
+ return
272
+ end
273
+ if File.exist?(link_map_file_name)
274
+ puts "获取的linkmap文件路径为:#{link_map_file_name}"
275
+ puts "\033[32m获取LinkMap文件: #{link_map_file_name}成功,开始分析数据...\033[0m"
276
+ else
277
+ puts "\033[31m#{link_map_file_name}文件不存在,请重新输入 \033[0m"
278
+ return
279
+ end
280
+ # 开始处理数据
281
+ link_map = LinkMap.new(link_map_file_name)
282
+ link_map.handle_map #处理文件为对象,然后继续后续操作
283
+ link_map.handle_l_sym_map #处理symbols为hashmap
284
+
285
+ # 所有的文件
286
+ link_map.l_obj_files
287
+ # 所有的symbols
288
+ link_map.l_symbols
289
+
290
+ # 处理得到每个obj_file的大小
291
+ link_map.l_obj_files.each do |obj|
292
+ if link_map.l_sym_map[obj.serial_number]
293
+ link_map.l_sym_map[obj.serial_number].each do |symb|
294
+ obj.o_size = obj.o_size + symb.s_size.hex
295
+ end
296
+ end
297
+ end
298
+ # key为文件名,value为ojbect
299
+ sort_by_obj_files_map = link_map.l_obj_files.group_by(&:o_name)
300
+ # save_file_path = SizeResult.getSaveFileName(project_folder)
301
+ # save_file = File.new(save_file_path,"w+")
302
+ # sort_by_obj_files_map.keys.each do |sss|
303
+
304
+ # save_file.puts("#{sort_by_obj_files_map[sss][0].o_name} #{sort_by_obj_files_map[sss][0].o_size}")
305
+ # end
306
+ # save_file.close
307
+ # exit
308
+
309
+
310
+
311
+ size_results = [] #盛放计算结果
312
+ size_files = []
313
+ space_index = 0
314
+ puts "计算开始"
315
+ traverse_dir(sort_by_obj_files_map,project_folder,size_results,size_files,space_index)
316
+ size_results.reverse!
317
+ # 存储为文件
318
+ save_file_path = SizeResult.getSaveFileName(project_folder)
319
+ if File.exist?(save_file_path)
320
+ File.delete(save_file_path)
321
+ end
322
+ save_file = File.new(save_file_path,"w+")
323
+ o_index = 2
324
+ size_results.each do |o|
325
+ result_str = "#{' ' * o.space_count}├── #{o.folder_name.split('/').last} #{SizeResult.handleSize(o.size)}(#{o.size})"
326
+ save_file.puts(result_str)
327
+ end
328
+ save_file.close
329
+ puts "分析结果已经保存为文件,位置为:\n\033[32m#{save_file_path}\033[0m"
330
+ end
331
+ def self.traverse_dir(sort_by_obj_files_map,file_path,results,size_files,space_index)
332
+ s_result = SizeResult.new
333
+ s_result.folder_name = file_path
334
+ space_index = space_index + 2
335
+ file_name_arr = [] #盛放计算过的类
336
+ Find.find(file_path) do |file|
337
+ # 不包含图片
338
+ if File.file?(file) && !(File.extname(file) =~ /(png|gif|jpg|bmp|jpeg)/)
339
+ file_name = File.basename(file,".*")
340
+ if !file_name_arr.include?(file_name) && sort_by_obj_files_map[file_name] #没有已经计算过
341
+ s_result.size = s_result.size + sort_by_obj_files_map[file_name][0].o_size
342
+ file_name_arr << file_name
343
+ end
344
+ elsif File::directory?(file) && file != file_path
345
+ traverse_dir(sort_by_obj_files_map,file,results,size_files,space_index)
346
+ end
347
+ end
348
+ if s_result.size > 0 && !size_files.include?(s_result.folder_name)
349
+ s_result.space_count = space_index
350
+ results << s_result
351
+ size_files << s_result.folder_name
352
+ end
353
+ end
354
+ end
355
+ class SizeResult
356
+ attr_accessor :file_name, :file_serial_numers, :size,:folder_name, :space_count
357
+ def initialize
358
+ @file_serial_numers = []
359
+ @size = 0
360
+ end
361
+ # size字符化
362
+ def self.handleSize(size)
363
+ if size > 1024 * 1024
364
+ return format("%.2f",(size.to_f/(1024*1024))) + "MB"
365
+ elsif size > 1024
366
+ return format("%.2f",(size.to_f/1024)) + "KB"
367
+ else
368
+ return size.to_s + "B"
369
+ end
370
+ end
371
+ # 获取结果文件保存到目录
372
+ def self.getSaveFileName(path_para)
373
+ path = Pathname.new(path_para)
374
+ # 要保存的地址
375
+ save_file_path = path.dirname.to_s + "/" + "parse_" + path.basename.to_s + "_result(#{Time.new.strftime("%Y%m%d%H%M%S")}).xls"
376
+ return save_file_path
377
+ end
378
+ end
379
+ end
380
+
381
+ # --------------------------------- Size utils class ---------------------------------
@@ -0,0 +1,98 @@
1
+ module BBItools
2
+ class PodInfo
3
+ attr_accessor :pod_name, :pod_version
4
+ def initialize(name, version)
5
+ @pod_name = name
6
+ @pod_version = version
7
+ end
8
+ end
9
+ class PodfileTiled
10
+ def self.podfile_tiled(args)
11
+ all_pods = [] #所有依赖的pod
12
+ exist_pods = [] #当前podfile已经存在的pod
13
+ need_add_pods = [] #当前需要添加到podfile中的pod
14
+ pod_tag = 1
15
+
16
+ fileInfo = File.open(args[0])
17
+
18
+ total_index = 0
19
+ fileInfo.each_line do |line|
20
+ line_string = line.delete("\n")
21
+ if line_string == 'PODS:'
22
+ # 配置成功,后续请直接使用git commit ,不要加 -m\033[0m
23
+ puts "\033[32m开始分析依赖\033[0m"
24
+ pod_tag = 1
25
+ next
26
+ elsif line_string == 'DEPENDENCIES:'
27
+ puts "\033[32m开始分析当前Podfile中已添加的依赖项\033[0m"
28
+ pod_tag = 2
29
+ next
30
+ elsif line_string == 'SPEC REPOS:'
31
+ pod_tag = 0
32
+ puts "\033[32mpodfile.lock分析结束\033[0m"
33
+ end
34
+
35
+ if pod_tag == 1 #分析所有pod
36
+ if line_string[0, 3] == ' -' && !line_string.include?('/')
37
+ # puts line_string
38
+ pod_version = line_string[/\((.*?)\)/, 1]
39
+ pod_name =
40
+ line_string.gsub(pod_version, '').delete('(').delete(')').delete(
41
+ ':'
42
+ ).delete('-').strip
43
+ temp_pod = PodInfo.new(pod_name, pod_version)
44
+ all_pods << temp_pod
45
+ puts "查找到pod库:#{pod_name}, 版本号为:'#{pod_version}' #{all_pods.length}"
46
+ end
47
+ end
48
+
49
+ if pod_tag == 2 #分析当前podfile已经有的pod
50
+ pod_name
51
+ pod_version = line_string[/\((.*?)\)/, 1]
52
+ if pod_version
53
+ pod_name =
54
+ line_string.gsub(pod_version, '').delete('(').delete(')').delete(
55
+ ':'
56
+ ).delete('-').strip
57
+ else
58
+ pod_name = line_string.delete('-').lstrip.rstrip
59
+ end
60
+ # if pod_name.length == 0 || pod_name.include?('/')
61
+ # next
62
+ # end
63
+ temp_pod = PodInfo.new(pod_name, pod_version)
64
+ if pod_version
65
+ temp_pod.pod_version = pod_version.delete('=').strip
66
+ end
67
+
68
+ exist_pods << temp_pod
69
+ puts "Podfile中已包含 #{pod_name}, 版本号为:'#{pod_version}'"
70
+ end
71
+ end
72
+ temp_exist_pods = []
73
+ all_pods.each do |all_pod|
74
+ exist_pods.each do |exist_pod|
75
+ exist_pod_name = exist_pod.pod_name
76
+ if exist_pod_name.include?('/')
77
+ exist_pod_name = exist_pod_name.split('/')[0]
78
+ end
79
+ if all_pod.pod_name == exist_pod_name
80
+ temp_exist_pods << all_pod
81
+ end
82
+ end
83
+ end
84
+
85
+ need_add_pods = all_pods - temp_exist_pods
86
+ if need_add_pods.length == 0
87
+ puts "\033[32m恭喜!!!无需平铺,当前已全部平铺\033[0m"
88
+ else
89
+ puts "\033[32m以下为要平铺的库,直接复制粘贴至Podfile中即可:\033[0m"
90
+ need_add_pods.each do |to_add|
91
+ puts "pod '#{to_add.pod_name}', '#{to_add.pod_version}'"
92
+ end
93
+ end
94
+
95
+ end
96
+ end
97
+ end
98
+
@@ -0,0 +1,129 @@
1
+ require 'find'
2
+ require 'spreadsheet'
3
+ module BBItools
4
+ # 字符串操作类
5
+ class StringHandle
6
+ # originStr中是否包含targetStrs中的内容
7
+ def self.containsStr(originStr,targetStrs)
8
+ targetStrs.each_with_index {|item,idx|
9
+ if originStr.include?(item)
10
+ return idx
11
+ end
12
+ }
13
+ return -1
14
+ end
15
+ end
16
+ # 搜索结果类
17
+ class SearchResult
18
+ attr_accessor :file_name, :in_line, :result_str, :key_str
19
+
20
+ def initialize(tempName,tempInLine,tempResultStr,tempKeyStr)
21
+ @file_name = tempName
22
+ @in_line = tempInLine
23
+ @result_str = tempResultStr
24
+ @key_str = tempKeyStr
25
+ end
26
+ end
27
+
28
+ # Main class
29
+ class StringSearcher
30
+ attr_accessor :search_strs, :search_in, :result
31
+ def initialize(temp_SearchStrs,temp_SearchIn)
32
+ @search_strs = temp_SearchStrs
33
+ @search_in = temp_SearchIn
34
+ @result = []
35
+ end
36
+ # 第二步开始搜索
37
+ def search
38
+ if check_exist
39
+ handle_method = ''
40
+ if File.file?(@search_in) #如果是文件
41
+ handle_method = "search_in_file"
42
+ else
43
+ handle_method = "search_in_folder"
44
+ end
45
+ self.send(handle_method,@search_in)
46
+ else
47
+ puts "\033[31m文件不存在,请检查输入是否正确\033[0m"
48
+ return
49
+ end
50
+ end
51
+ # 从文件查找
52
+ def search_in_file(temp_file)
53
+ line_index = 1
54
+ File.read(temp_file).each_line do |line|
55
+ haveIndex = StringHandle.containsStr(line,@search_strs)
56
+ if haveIndex != -1
57
+ search_result = SearchResult.new(temp_file,line_index,line,@search_strs[haveIndex])
58
+ @result << search_result
59
+ end
60
+ line_index = line_index + 1
61
+ end
62
+ end
63
+
64
+ # 从文件夹查找
65
+ def search_in_folder(unuse)
66
+ puts @search_in_folder
67
+ Find.find(@search_in) do |filename|
68
+ if File.file?(filename) #如果是文件,则从文件中查找,忽略文件夹
69
+ search_in_file(filename)
70
+ end
71
+ end
72
+ end
73
+ # 第一步:检查是否存在
74
+ def check_exist
75
+ if File.file?(@search_in)
76
+ puts "\033[32m从文件中查找\033[0m"
77
+ return true
78
+ elsif File::directory?(@search_in)
79
+ puts "\033[32m从文件夹中查找\033[0m"
80
+ return true
81
+ else
82
+ return false
83
+ end
84
+ end
85
+ # 第一个参数为要搜索的文件或者文件夹名称
86
+ # 第二个参数为要搜索的字符串
87
+ def self.search_result(temp_search_in,temp_search_strs)
88
+ if temp_search_in.nil?
89
+ puts "\033[31m传入的参数有误,第一个参数为要搜索的文件或者文件夹名称,第二个参数为要搜索的字符串(如要查找多个str使用英文,分割),两个参数中间用空格区分\033[0m"
90
+ return
91
+ end
92
+ if temp_search_strs.nil?
93
+ puts "\033[31m传入的参数有误,第一个参数为要搜索的文件或者文件夹名称,第二个参数为要搜索的字符串(如要查找多个str使用英文,分割),两个参数中间用空格区分\033[0m"
94
+ return
95
+ end
96
+ # 传入的可能是字符串数组
97
+ searcher = StringSearcher.new(temp_search_strs.split(","),temp_search_in)
98
+ searcher.search
99
+ if searcher.result.size == 0
100
+ puts "\033[32m没有找到相关字段\033[0m"
101
+ return
102
+ end
103
+ # 输出搜索的内容
104
+ Spreadsheet.client_encoding = 'utf-8'
105
+ book = Spreadsheet::Workbook.new
106
+ sheet1 = book.create_worksheet
107
+ sheet1.row(0)[0] = "文件名"
108
+ sheet1.row(0)[1] = "包含字符串"
109
+ sheet1.row(0)[2] = "文件所在目录"
110
+ sheet1.row(0)[3] = "查找内容所在行"
111
+ sheet1.row(0)[4] = "查找结果Str"
112
+
113
+ searcher.result.each_with_index do |item,i|
114
+ sheet1.row(i+1)[0] = File.basename(item.file_name)
115
+ sheet1.row(i+1)[1] = item.key_str
116
+ sheet1.row(i+1)[2] = File.dirname(item.file_name)
117
+ sheet1.row(i+1)[3] = item.in_line
118
+ sheet1.row(i+1)[4] = item.result_str
119
+ if i < 10
120
+ puts "#{item.key_str} is in file:#{File.basename(item.file_name)} and Inline:#{item.in_line}"
121
+ end
122
+
123
+ end
124
+
125
+ puts "\033[32m查找成功,内容已经保存到#{File.dirname(searcher.search_in)},请点击查看\033[0m"
126
+ book.write "#{File.dirname(searcher.search_in)}/search_result.xls"
127
+ end
128
+ end
129
+ end