最近工作中有项工作做的劳神不说,更少眼睛累…于是写了下面的工具帮忙干活.

工作内容,查看日志,将执行存在异常的组件找出来,说明白点就是看组件开始时间,结束时间,比对看哪个组件执行费时…,从而改进程序

之前是日志在服务器上,使用vi看

日志文件xxx.log

2018-09-07 16:58:01.343 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件开始 @ 不定长通讯组件
2018-09-07 16:58:01.344 DEBUG  TEST_C-00000174 [AbstractComm        ] 通讯组件 @ 使用接入适配器
2018-09-07 16:58:01.345 INFO   TEST_C-00000174 [AbstractComm        ] 通讯组件 @ 接收数据[4408],报文数据不记录
2018-09-07 16:58:01.346 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件结束 @ 不定长通讯组件
2018-09-07 16:58:01.346 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件开始 @ 拆包组件
2018-09-07 16:58:01.346 DEBUG  TEST_C-00000174 [MessageUnpack       ] 报文拆包组件 @ 使用报文'test/message/req.rcd',拆包变量名'recv'
...
...
2018-09-07 16:58:01.347 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件结束 @ 拆包组件
2018-09-07 16:58:01.347 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件开始 @ groovy脚本组件
...
...
2018-09-07 16:58:01.348 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件结束 @ groovy脚本组件
2018-09-07 16:58:01.348 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件开始 @ 拼包组件
2018-09-07 16:58:01.349 DEBUG  TEST_C-00000174 [MessagePack         ] 报文拼包组件 @ 使用报文'test/message/res_dc.rcd',拼包变量名'send'
...
...
2018-09-07 16:58:01.354 DEBUG  TEST_C-00000174 [MessagePack         ] 报文拼包组件 @ 拼包后报文为[4408]:
2018-09-07 16:58:01.356 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件结束 @ 拼包组件
2018-09-07 16:58:01.356 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件开始 @ 服务网关SDK发送组件

组件执行是严格按照流程,一个执行完才能进入下一个…
但是日志是异步输出的,导致日志输出的顺序与组件执行的顺序没有必然关系,就是会出现后面执行的组件日志中出现在文件的靠前的位置,添加了工作的难度…

预处理–>src.txt

使用shell命令将满足条件的日志行输出到指定文件中,src.txt,作为解析的源文件
grep 组件 ../TEST_C.log | grep TEST_C-00000174 > src.txt
这句意思是,从TEST_C.log日志中搜索 包含TEST_C-00000174的行中含有组件两个字的行内容输出到src.txt中.>代表输出

2018-09-07 16:58:01.343 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件开始 @ 不定长通讯组件
2018-09-07 16:58:01.344 DEBUG  TEST_C-00000174 [AbstractComm        ] 通讯组件 @ 使用接入适配器
2018-09-07 16:58:01.345 INFO   TEST_C-00000174 [AbstractComm        ] 通讯组件 @ 接收数据[24],报文数据不记录
2018-09-07 16:58:01.346 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件结束 @ 不定长通讯组件
2018-09-07 16:58:01.346 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件开始 @ 拆包组件
2018-09-07 16:58:01.346 DEBUG  TEST_C-00000174 [MessageUnpack       ] 报文拆包组件 @ 使用报文'test/message/req.rcd',拆包变量名'recv'
2018-09-07 16:58:01.347 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件结束 @ 拆包组件
2018-09-07 16:58:01.347 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件开始 @ groovy脚本组件
2018-09-07 16:58:01.348 DEBUG  TEST_C-00000174 [AbstractComponent   ] 组件结束 @ groovy脚本组件
...

使用工具将其拉到本地,或者之后的操作也在服务器上就行了,将dos脚本,编写成shell脚本即可,上面的shell脚本作为参考

处理目标–>dest.xlsx

时间 分秒的毫秒数 时差 日志级别 流水 组件名称 内容
2018-09-07 16:58:01.343 1343 1343 DEBUG TEST_C-00000174 组件开始 不定长通讯组件
2018-09-07 16:58:01.343 1343 0 DEBUG TEST_C-00000174 组件开始 不定长通讯组件
2018-09-07 16:58:01.344 1344 1 DEBUG TEST_C-00000174 通讯组件 使用接入适配器
2018-09-07 16:58:01.345 1345 1 INFO TEST_C-00000174 通讯组件 接收数据[4408],报文数据不记录
2018-09-07 16:58:01.346 1346 1 DEBUG TEST_C-00000174 组件开始 拆包组件
2018-09-07 16:58:01.346 1346 0 DEBUG TEST_C-00000174 组件结束 不定长通讯组件

使用到的jar包

dom4j-1.6.1.jar
poi-3.9.jar
poi-ooxml-3.9.jar
poi-ooxml-schemas-3.9.jar
xmlbeans-2.3.0.jar

代码

注:从当前目录的src.txt读取文件内容,处理后放入到当前目录的dest.xlsx文件中
源文件与目标文件路径可以在配置文件txt2excel.properties中修改.
这里只是用POI操作.xlsx的,

package com.yangxuan.excel;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class TXT2Excel {private static String srcPath;private static String destPath;static{Properties prop = new Properties();try {//读取配置文件.properties中的信息prop.load(new FileInputStream(new File("txt2excel.properties")));srcPath = prop.getProperty("srcPath");  destPath = prop.getProperty("destPath");    } catch (Exception e) {e.printStackTrace();}   }public static void write(String destPath,List<String> fileContent) throws IOException, ParseException{//ArrayList<String> row = new ArrayList<String>();XSSFWorkbook xssfwb = new XSSFWorkbook();XSSFSheet xssfSheet = xssfwb.createSheet("sheet111");XSSFRow xssfRow = null; //读取文件内容long old = 0L;//处理文本数据String content = "";for (int i = 0; i < fileContent.size(); i++) {content = fileContent.get(i);String cell1 = content.substring(0, 23).trim();long cell2 = dateFormat(cell1);xssfRow = xssfSheet.createRow(i);xssfRow.createCell(0).setCellValue(cell1);xssfRow.createCell(1).setCellValue(cell2);xssfRow.createCell(2).setCellValue(cell2-old);old=cell2;xssfRow.createCell(3).setCellValue(content.substring(23, 30).trim());xssfRow.createCell(4).setCellValue(content.substring(30, 46).trim());String[] split2 = content.substring(70).split("@");if(split2.length==2){xssfRow.createCell(5).setCellValue(split2[0].trim());xssfRow.createCell(6).setCellValue(split2[1].trim());}else{xssfRow.createCell(5).setCellValue(content.substring(70).trim());}}FileOutputStream fos = new FileOutputStream(new File(destPath));xssfwb.write(fos);}/*** 将字符串数据转化为毫秒数* @return 分+秒+毫秒位的毫秒数* @throws ParseException */public static long dateFormat(String dateString) throws ParseException{String sub = dateString.substring(0,16);Calendar c = Calendar.getInstance();//2018-09-07 16c.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(sub));long timeInMillis1 = c.getTimeInMillis();//2018-09-07 16:58:01.343c.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(dateString));long timeInMillis2 = c.getTimeInMillis();return timeInMillis2-timeInMillis1;}/*** 获取文件内容* @param srcPath* @return List<String>* @throws IOException*/public static final List<String> getFileContent(String srcPath) throws IOException{List<String> fileContent = new ArrayList<String>();  try {File f = new File(srcPath);if (f.exists()) {FileReader fr = new FileReader(srcPath);BufferedReader br = new BufferedReader(fr); // 建立BufferedReader对象,并实例化为brString line = br.readLine(); // 从文件读取一行字符串// 判断读取到的字符串是否不为空while (line != null) {if(line.length()>0){fileContent.add(line);}line = br.readLine(); // 从文件中继续读取一行数据}//排序Collections.sort(fileContent);br.close(); // 关闭BufferedReader对象fr.close(); // 关闭文件}} catch (IOException e) {throw e;}return fileContent;}public static void main(String[] args) throws IOException, InvalidFormatException, ParseException {List<String> fileContent = getFileContent(srcPath);TXT2Excel.write(destPath,fileContent);}
}

配置文件txt2excel.properties

放在txt2excel.jar包同级目录中

#\u6E90\u6587\u4EF6
srcPath=src.txt
#\u76EE\u6807\u6587\u4EF6
destPath=dest.xlsx

前提,组件执行按照流程,一个结束流程后的另一个才会开始,日志记录了组件执行时间戳,只是由于日志的异步输出导致日志内容更流程所示内容有差异

这里对读取到的文件行内容进行排序处理

写入excel前做时差计算,方便查看

eclipse打jar包为可执行jar

  • file–>Export–>java–>Runnable JAR File–>Next

  • Launch configuration:TXT2Excel - txt2excel
    类名-工程名
    这里是下拉框选择的,前提TXT2Excel类中必须有main方法作为程序入口,

  • Export destination:H:\utils\txt2excel.jar
    这一步是指定打包到哪个目录下,并指定打包成的包名
  • Library handing:
    Extract required libraries into generated JAR:将依赖的jar解压出来变成class丢进你生成的jar里面;
    Package required libraries into generated JAR:将依赖的jar不解压,直接放进你生成的jar里面;
    Copy required libraries into a sub-folder next to the generated JAR:将依赖的jar放到你生成jar的同级目录下的”xxx_lib”文件夹里面。
    我选的是第三个.
  • 完成Finish

执行完H:\utils\目录下生成的文件

txt2excel_libdom4j-1.6.1.jarpoi-3.9.jarpoi-ooxml-3.9.jarpoi-ooxml-schemas-3.9.jarxmlbeans-2.3.0.jar
txt2excel.jar

将需要解析的文本文件src.txt放入到H:\utils\目录下,这里工具里面写死了,只会读取src.txt文件

  • win+r–>cmd:
  • java -jar txt2excel.jar

会生成目标文件dest.xlsx,查看日志方便多了,

DOS脚本

但是每次都使用dos命令操作,还是有点麻烦,这里就写一个DOS脚本文件.之后双击它就可以了
H:\utils\目录下新建txt2excel.bat,文本方式编辑,保存,内容如下:

@echo off
rem 这是注释
rem @echo off 第一行的意思是不显示后续命令行及当前命令行rem title 名称    这个名称会显示在窗口的左上角,打开多个dos窗口时,这个就有用了
title txt2excelrem echo 在dos窗口中输入一行内容
echo txt2excel Starting......rem 执行我们要运行的命令
java -jar txt2excel.jarecho txt2excel end......
rem pause 暂停,等待按键继续,这个方便我们在报错后查看报错信息,不写这个的话,dos窗口一闪即逝,没法看
pause

读取文本文件内容并写到excel相关推荐

  1. python读取txt文件并写入excel-Python读取txt内容写入xls格式excel中的方法

    由于xlwt目前只支持xls格式,至于xlsx格式,后面会继续更新 import xlwt import codecs def Txt_to_Excel(inputTxt,sheetName,star ...

  2. python读取txt文件并输出到表格_Python读取txt内容写入xls格式excel中的方法

    由于xlwt目前只支持xls格式,至于xlsx格式,后面会继续更新 import xlwt import codecs def Txt_to_Excel(inputTxt,sheetName,star ...

  3. C#读取文本文件和C# 写文本文件

    C#读取文本文件和C# 写文本文件 using System; using System.Collections.Generic; using System.Linq; using System.Te ...

  4. java解析txt文本文件_java读取文本文件内容方法详解,java如何读取txt文件?

    你知道java读取文本文件内容方式都有哪些吗?下面要给大家分享的就是比较简单的方法,一起来了解一下吧. 如何使用java实现读取TXT文件里的内容的方法以及思路: 下面先来看一下例子:import j ...

  5. JAVA读取文本文件内容以流的形式返回到前端

    JAVA读取文本文件内容以流的形式返回到前端 此方法放Controller ServletOutputStream out = null;ByteArrayOutputStream baos = nu ...

  6. python提供了方法用于读取文本文件内容_python提供了哪三种方法用于读取文本文件的内容?...

    三种方法分别是:"read()"."readline()"."readlines()"."read()"是一次性读取文件 ...

  7. perl读取文本文件内容

    #下面的代码,按行读取文件中内容: $count = 0; while (defined(my $line=<>)){     chomp($line);     $count++;   ...

  8. python读txt写入excel_Python读取txt内容写入xls格式excel中的方法

    import xlwt import codecs def Txt_to_Excel(inputTxt,sheetName,start_row,start_col,outputExcel): fr = ...

  9. vue中读取文本文件内容_vue中读取本地文件

    背景 再项目开发过程中,有动态设置字体图标的需求,保证图标选框中的图标和最后发布的项目图标库一致. 思路 读取本地字体图标库文件,然后进行相应的字符串转换,这样就可以保持图标的一致啦 步骤 1.获取本 ...

  10. oracle 直接读取文件内容,Perl读取文本文件内容

    ################################## 按行读取文件 ################################## open(FILE,"filenam ...

最新文章

  1. mysql backup_MySQL备份还原——AutoMySQLBackup介绍
  2. 01-单一职责原则(SPR)
  3. Nature150岁生日:盘点史上十大重磅论文,中国13篇文章登上封面!
  4. AD转换实验 编写程序利用ADC0804 AD转换器采集电位器的模拟电压,将采集到的数字量在程序中换算成实际采集的模拟电压,并用数码管显示所采集的实际模拟电压值。(如:AD转换后的数字量为128,则
  5. Camera--V4L2驱动学习记录
  6. 【渝粤教育】国家开放大学2018年春季 0050-22T民族理论与民族政策 参考试题
  7. win10使用import pcap 建议放弃,还是使用linux系统吧
  8. c语言中1和0什么意思啊,精讲LOOKUP公式中1和0的含义,这1500字的详细解析值得收藏一份...
  9. win10文件索引服务器,Win10系统修改索引文件夹路径的方法
  10. 计算机简历个人优势,简历个人优势怎么写
  11. python 比对两个excel表数据_Python第17课:两个数据表如何比对碰撞?(二)
  12. 男生如何找准自己的穿衣风格,提升衣着品味(转载:搜狐男人)
  13. win7 GHOST删除桌面上IE图标
  14. Python3 requests模拟登录天善智能!
  15. 中国特殊灯具行业市场供需与战略研究报告
  16. 2021年数据泄露成本报告解读
  17. 教程 | 阿克曼结构移动机器人的gazebo仿真(二)
  18. 【SSM+ElementUI】综合练习-Axios Mock EasyMock nodejs npm webpack vuecli restful 请求
  19. 2010北京联合大学计算机答案,2010年、2011年单考单招考试练习题 - 特殊教育学院- 北京联合大学.doc...
  20. java唯一并且有序集合_成都汇智动力-Java集合类详解

热门文章

  1. 数据分析——实习僧数据分析岗招聘信息分析
  2. html5不用reload重置网页,refresh和reload
  3. 大二下学习资料的整理
  4. 2021西湖论剑 Re wp
  5. linux中文件权限为d-rwxr-xr,Linux基础知识之文件权限详解
  6. vmsd文件+服务器,VMWARE ESX中利用SnapShot(快照)文件恢复虚拟机数据
  7. win10任务管理器禁用_如何在Windows 10的文件资源管理器中禁用广告和通知
  8. 对udp组播流(MPTS)进行简单的收录
  9. 数据错误循环冗余检查是什么意思_磁盘阵列是什么,用在什么地方,有什么优点...
  10. 千寻的计算机字符,透过《战狼2》影评,细看简单字符处理 | R语千寻