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
        }

    }
    
        
}

猜你喜欢

转载自www.cnblogs.com/libin6505/p/10769349.html