txt文件按行处理工具类(可以截取小说、分析日志等)【我】
txt文件按行处理工具类(可以分析日志、截取小说等)
package file; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class ReadTxtUtil { public static void main1(String[] args) throws Exception {
getDesired();
} /**
* 取出想要的文件
* @date 2019年4月1日 上午11:26:36
* @throws Exception
*/
public static void getDesired() throws Exception {// 输入文件路径 List<String> temp = new ArrayList<>();
//输入文件
// File f = new File("D:\\a\\b\\in.txt");
File f = new File("D:\\a\\info_log-2019-04-10h2.log");
// InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"GBK");
InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"utf-8");
BufferedReader br = new BufferedReader(reader);
String str=null; //下面按行读。我实现的其实就是变相的分行打印,如果有更好的方法请大家指教
//输出文件
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("D:\\a\\b\\out11.txt"),"utf-8");
BufferedWriter bw = new BufferedWriter(os);
PrintWriter out = new PrintWriter(bw);
//定义开始写入新文件标记
boolean start = false;
//结束写入标记
boolean end = false;
// 从 包含文字 :第一三四三章 展现力量(第四更!) 的行开始复制写入到新文件中
String matchStart = "20190323964的处理预计线程数为:4,";
String matchEnd = "scheduler_Worker-8的--consume time----任务耗时:2363317 毫秒";
while((str=br.readLine())!=null){ if (!start) {
if (str.contains(matchStart)) {
start = true;
System.out.println("找到开始字符串"+str);
}
} if (str.contains(matchEnd)) {
end = true;
System.out.println("找到结束字符串"+str);
} if (start) {
if (end) {
break;
}
//符合标记,逐行写入到新文件
out.println(str);
}
} br.close();
reader.close(); bw.close();
os.close();
out.close();
} // --------------下面才是真正使用的--------------- /**
* @param inFileName 输入文件名称(全路径)
* @param outFileName 输出文件名称
* @param matchStart 要匹配的开始字符串(如果为null,则从文件开头开始)
* @param matchEnd 要匹配的结束字符串(如果为null,则直到文件结尾)
* @param matchContain 要匹配的行内字符串(如果为null,则全部输出;如果不为null,则只输出包含matchContain字符串的行)
* @throws Exception
*/
public static void getDesired(String inFileName,String outFileName,String matchStart,String matchEnd,String matchContain) throws Exception {// 输入文件路径 List<String> temp = new ArrayList<>();
//输入文件
// File f = new File("D:\\a\\b\\in.txt");
// File f = new File("D:\\a\\info_log-2019-04-10h2.log");
File f = new File(inFileName);
// InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"GBK");
InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"utf-8");
BufferedReader br = new BufferedReader(reader);
String str=null; //下面按行读。我实现的其实就是变相的分行打印,如果有更好的方法请大家指教
//输出文件
// OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("D:\\a\\b\\out11.txt"),"utf-8");
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(outFileName),"utf-8");
BufferedWriter bw = new BufferedWriter(os);
PrintWriter out = new PrintWriter(bw);
//定义开始写入新文件标记
boolean startF = false;
//结束写入标记
boolean endF = false; // 从 包含文字 :第一三四三章 展现力量(第四更!) 的行开始复制写入到新文件中
// String matchStart = "20190323964的处理预计线程数为:4,";
// String matchEnd = "scheduler_Worker-8的--consume time----任务耗时:2363317 毫秒";
while((str=br.readLine())!=null){ if (matchStart != null) {
if (!startF) {
if (str.contains(matchStart)) {
startF = true;
System.out.println("找到开始字符串"+str);
}
}
}else {
startF = true;
} if (matchEnd!=null) {
if (str.contains(matchEnd)) {
endF = true;
System.out.println("找到结束字符串"+str);
}
} if (startF) {
if (endF) {
break;
}
//如果有每行需要匹配的东西则只输出匹配的行
if (matchContain!=null) {
if (str.contains(matchContain)) {
//符合标记,逐行写入到新文件
// hLine1(str, matchContain); //可以对要输出的行进行特殊处理
out.println(str);
}
}else {
//如果没有设置每行匹配的字符串,则输出开始到结尾所有行的内容
//符合标记,逐行写入到新文件
out.println(str);
} }
} br.close();
reader.close(); bw.close();
os.close();
out.close();
} /**
* 将当期行只取出时间字符串加上以要匹配的字符开头的部分
* @param source 原始字符串
* @param startRe 从startRe开始匹配,即只返回startRe其后的部分
*/
public static void hLine1(String source,String startRe) {
// String s ="[fm-log] 2019-04-25 14:26:01,040 [DubboServerHandler-10.128.90.162:3009-thread-148] INFO - 批量实名认证Timer---入参CUST_ID:{}200004031631";
String timeRe = "(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3})";
// String startRe="批量实名认证Timer";
//匹配事件字符串 2019-04-25 14:26:01,872
// String regex = "(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}).*(批量实名认证Timer.*)";
String regex = timeRe+".*("+startRe+".*)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(source);
if (m.find()) {
source=m.group(1)+"===="+m.group(2);
System.out.println(source); //2019-04-25 14:26:01,040====批量实名认证Timer---入参CUST_ID:{}200004031631
}
} //使用
public static void main(String[] args) throws Exception {
// D:/a/d/info_log-2019-04-25.log
getDesired("D:/a/d/info_log-2019-04-25.log", "D:/a/d/1.txt", null, null, "批量实名认证Timer---");
} //取出时间字符串测试
public static void main2(String[] args) {
String s = "[fm-log] 2019-04-25 14:26:01,872 [DubboServerHandler-10.128.90.162:3009-thread-148";
//匹配事件字符串 2019-04-25 14:26:01,872
String regex = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println(m.group()); //2019-04-25 14:26:01,872
} } }
注意:
使用中如果发现输出文件中没有数据,请检查输入文件的编码是否为UTF-8 如果为GBK,请修改代码中的:
// InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"GBK");
InputStreamReader reader = new InputStreamReader(new FileInputStream(f),"utf-8");
为 GBK。
txt文件按行处理工具类(可以截取小说、分析日志等)【我】的更多相关文章
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
- 【转载】C#工具类:实现文件操作File的工具类
在应用程序的开发中,文件操作的使用基本上是必不可少的,FileStream类.StreamWriter类.Directory类.DirectoryInfo类等都是文件操作中时常涉及到的类,我们可以通过 ...
- 从接口自动化测试框架设计到开发(二)操作json文件、重构json工具类
用例模板里的请求数据多,看起来很乱,所以可以通过访问另外一个文件的方式获取请求数据 把请求数据都放在一个json文件中 取出login的内容: import json fp = open('G:/un ...
- Java文件编码自动转换工具类(只改变编码,不会改变文件内容)
本篇随笔主要介绍了一个用java语言写的将一个文件编码转换为另一个编码并不改变文件内容的工具类: 通过读取源文件内容,用URLEncoding重新编码解码的方式实现. public class Cha ...
- iOS开发 -- 为本地文件添加自定义属性的工具类
前言:实际开发,我们可能会有这样的需求,就是为文件添加自定义的属性,或者是可以将文件的相关信息添加进该文件的属性中,这样可以以备下次读取利用. 那么本文就是要介绍"拓展文件属性的工具类&qu ...
- 【转载】Java文件编码自动转换工具类
本篇随笔主要介绍了一个用java语言写的将一个文件编码转换为另一个编码并不改变文件内容的工具类: 通过读取源文件内容,用URLEncoding重新编码解码的方式实现. 1 public class C ...
- Spring MVC文件上传下载工具类
import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import ...
- 删除txt文件每行第一(n)个空格前内容的方法
1. 把要处理的文本保存在a.txt文件中 2. 在相同文件夹中新建一个xx.txt文件,输入下面代码,再把文件名改为xx.bat. @echo offset fn=a.txt(for /f &quo ...
- Android 命令行执行工具类
最近在做android项目的时候,需要执行命令行命令,之前在网上找的不仅杂乱而且错误多,于是自己写了一份. 话不多说,直接上代码 import android.util.Log; import jav ...
随机推荐
- Chrome浏览器,处理input自动填充时带黄色背景色
/*Chrome浏览器打开网页,input自动赋值时,会带上屎黄色的背景色,下面是通过延长增加自动填充背景色的方式, 让用户感受不到样式的变化*/ input:-webkit-autofill, in ...
- MongoDB副本集功能及节点属性梳理
副本集的主要功能 副本集是MongoDB高可用的基础,其主要作用 归纳为以下几点: (1)高可用,防止设备(服务器.网络)故障.提供自动FailOver功能. (2)无需配置高可用性虚拟节点:无论是S ...
- IE8环境下的上传图片预览
今天做一个需要在IE浏览器上使用的信息录入项目,遇到了图片上传预览的问题,找了一些资料,最后使用了IE自带的滤镜做到了 <!--HTML IE8不支持opacity,只能使用双层,一层背景半透明 ...
- SQL Server -- 回忆笔记(五):T-SQL编程,系统变量,事务,游标,触发器
SQL Server -- 回忆笔记(五):T-SQL编程,系统变量,事务,游标,触发器 1. T-SQL编程 (1)声明变量 declare @age int (2)为变量赋值 (3)while循环 ...
- c/c++ linux epoll系列3 利用epoll_wait设置timeout时间长度
linux epoll系列3 利用epoll_wait设置timeout时间长度 epoll_wait函数的第四个参数可以设置,epoll_wait函数的等待时间(timeout时间长度). 例子1, ...
- 如何使用PowerDesigner建表
说明 个人认为,直接使用数据库管理工具如Navicat直接建表,如果后期需要进行库的迁移,不是那么方便,不如直接在PowerDesigner里面建表,更自由一些 版本:PowerDesigner15 ...
- 比较两个slice、struct或者map是否相等
我们可以直接使用reflect.DeepEqual来比较两个slice.struct或者map是否相等 package main import ( "fmt" "refl ...
- 【Python 补充01】Python运算符
Python运算符 举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符. 1.算术运算符 + - * / # 加减乘除 % # 取模(返回除 ...
- Zabbix 3.4.7调整监控阈值以及告警级别
1.找到需要监控的主机:右上角进行搜索 我们要更改sepm02p的阈值和级别: 进行更改级别:先点击Triggers , 选中要更改的监控项,例如我要更改CPU,点击以下红色标出的,千万不要选择Tem ...
- leetcode 224. Basic Calculator 、227. Basic Calculator II
这种题都要设置一个符号位的变量 224. Basic Calculator 设置数值和符号两个变量,遇到左括号将数值和符号加进栈中 class Solution { public: int calcu ...