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 ...
随机推荐
- Linux(Centos7)下搭建SVN服务器 (转载)
系统环境:centos7.2 第一步:通过yum命令安装svnserve,命令如下: yum -y install subversion 此命令会全自动安装svn服务器相关服务和依赖,安装完成会自动停 ...
- Docker: 企业级镜像仓库Harbor部署(http)
Harbor离线安装包下载地址:https://github.com/goharbor/harbor Docker compose(安装harbor需要用到docker compose)下载地址:ht ...
- IBM小练习
'''例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解) 成人的BMI数值: 过轻:低于18.5 正常:18.5-23.9 过重:24- ...
- ASP.NET MVC5学习系列——身份验证、授权
一.什么是身份验证和授权 人们有时对用户身份验证和用户授权之间的区别感到疑惑.用户身份验证是指通过某种形式的登录机制(包括用户名/密码.OpenID.OAuth等说明身份的项)来核实用户的身份.授权验 ...
- springboot use
https://github.com/ityouknow/spring-boot-examples http://www.ityouknow.com/springboot/2017/06/26/spr ...
- spring boot 2.0 WebMvcConfigurerAdapter过时解决方法
第一种: @Configuration public class WebAppConfig implements WebMvcConfigurer{ @Bean public HandlerInter ...
- 基于element ui的级联选择器组件实现的分类后台接口
今天在做资产管理系统的时候遇到一个分类的级联选择器,前端是用的element的组件,需要后台提供接口支持. 这个组件需要传入的数据结构大概是这样的,详细的可参考官方案例: [{ value: ...
- 基于aws api gateway的asp.net core验证
本文是介绍aws 作为api gateway,用asp.net core用web应用,.net core作为aws lambda function. api gateway和asp.net core的 ...
- 使用exec和sp_executesql动态执行SQL语句(转载)
当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态来构造SQL查询语句,个人觉得用得比较多的地方就是分页存储过程和执行搜索查询的SQL语句.一个比较通用的分页存储过程,可能需要传入表名, ...
- H5 基于Web Storage 的客户端留言板
<!DOCTYPE html> <html> <head> <meta name="author" content="Yeeku ...