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 ...
随机推荐
- delphi做的程序如何连接SQL数据库
1. 新建一个FORM.在控件栏找到ADO一栏,把里面的ADOConnection和ADOQuery两个各建立一个放在FORM里.这两个控件运行后是不可见的,所以你可以随便放在FORM的任何位置.然后 ...
- HDFS副本放置策略
1.第一个副本放置在上传文件的DataNode上,如果是集群外提交,则随机挑选一个磁盘不太满,CPU不太忙的节点. 2.第二个副本放置在与第一个副本不同的机架上. 3.第三个副本放置在与第二个副本同机 ...
- 关于MongoDB 固定集合(capped collection)的知识梳理
一 . 什么是固定集合 MongoDB中有一种特殊类型的集合,值得我们特别留意,那就是固定集合(capped collection). 固定集合可以声明collection的容量大小,其行为类似于循环 ...
- sql 语句-初级进阶(二)
1.insert插入数据时注意事项: 每次插入一整行,不能半行或者是几列数据. 值与列数必须相同,包括数据类型也必须匹配. 不能为标识列指定值(就是最前面的那一序号列),它是自动增长的 列的数据类型为 ...
- linux 网络套接字
在内核分析网络分组时,底层协议的数据将传输到跟高的层.而发送数据的时候顺序是相反的.每一层都是通过加(首部+净荷)传向跟底层,直至最终发送. 这些操作决定了网络的的性能. 就如下图所示 linux因此 ...
- phpstorm ftp主动模式能连接上,但获取不到目录;
前面一直都在使用ST做开发,但是也想试试传说中的phpstorm神器.一切都弄好了,想使用它的远程开发功能,省去我本地开发然后再ftp上传做法. 但是却遇到了这个问题,困扰了我三四天!!!我各种百度都 ...
- 我超级推荐的Navicat Premium 12的下载,破解方法
今天给大家推荐一款炒鸡好用的数据库管理工具,使用它,可以很方便的连接各种主流数据库软件----Navicat Premium 12 但是,它是要钱的,不过我们可以使用破解机来破解它,步骤稍有些复杂,简 ...
- 周末班:Python基础之网络编程
一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好.但是如果这两个程序之间想要传递一个数据, ...
- 【Python 补充01】Python运算符
Python运算符 举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符. 1.算术运算符 + - * / # 加减乘除 % # 取模(返回除 ...
- Linux删除隐藏文件
方法2.ls -a 查询隐藏文件 将后缀名为.swp的文件删除 rm -f .nginx.conf.swp 再次编辑文件不在出现提示警告!