起因:
刚入职新公司,接了一个小任务,说来简单,就是把项目里现在所有的埋点任务过滤一遍,以新发给我的一个Excel表格数据为准,没有在表格里出现的埋点key就删除掉。当我接到这个任务的时候,内心其实是有一点抗拒的,毕竟是毫无技术含量低工作,而且项目中那么多文件我总不能一个个文件一行行代码找吧?!幸好我被告知项目中所有埋点功能都是通过一个Log类中的add方法来实现的,那样我只要查找项目中调用了这两个方法的地方改就可以了。
过程:
熟知快捷键低我激动的做起来,首先先创建了一个分支,然后command+shift+R输入了关键字之后,让我的心又沉了下去。。。因为项目中调用使用埋点的地方一共有300多处,如果我一个个查找-复制key-到excel里查找-删除代码这一个套路下来,怎么也得两三天才能完成吧,这还不是问题所在,问题的关键在于。。我。。太。。懒。。了。。。程序员就是懒啊!
那怎么办?忘了是谁说过,对于程序员来说,所有机械性操作的问题,都不应该成为你的问题(我自己杜撰的),能不能写个脚本之类的,自动触发AS的查找快捷键,然后自动和excel进行比较呢?这个念头刚一出现就被我打消了,研究操作AS快捷键的脚本的这个调研过程+学习时间,也许一两天就过去了。那怎么办?
突然想到,为什么我一定要通过AS的快捷键来查找代码?我在文件里一个个查找不可以吗?这样我就可以通过代码来实现了。。思路应该谁正确的,话不多说,赶紧开始编码~
解决:
第一步,读取app项目下的java文件,然后一行行读取代码,发现包含Log的就读取其中的key,然后记录到一个set里(这样可以自动排重)
关键代码如下:
*/
public void getCodeCount(String content) {
Matcher matcher = pattern.matcher(content);
content = matcher.replaceAll(" ");
String ss[] = content.split("\n");
for (String s : ss) {
if (s.trim().length() > 0 && !s.trim().startsWith("//")){
//
if (s.contains("TraceLog.add(\"")){
s = s.trim();
int firstIdx = s.indexOf("\"")+1;
int lastIdx = s.indexOf("\"",firstIdx);
String key = s.substring(firstIdx , lastIdx);
keyList.add(key);
}
}
}
}
第二步,读取excel里的key内容,保持到一个list里,
主要代码如下:
public static List readExcel(String filePath,int cellIdx){
List<String> keyList = new ArrayList<>(400);
Workbook book = null;
try {
book = getExcelWorkbook(filePath);
Sheet sheet = getSheetByNum(book,1);
System.out.println("sheet名称是:"+sheet.getSheetName());
int lastRowNum = sheet.getLastRowNum();
System.out.println("行数:"+lastRowNum);
System.out.println("*********excel里的key如下**************");
Row row = null;
for(int i=1;i<=lastRowNum;i++){
row = sheet.getRow(i);
if(row != null){
String v = row.getCell(cellIdx).getStringCellValue();
keyList.add(v);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return keyList;
}
第三步,两个集合差集,最后得到不在excel里的key共有25个。
以上是我这次任务的解决过程,如果大家有更好的方法,也请多多指教。