zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    刚体
    Unity3D游戏开发之数据持久化PlayerPrefs的使用
    用AudioSource.PlayClipAtPoint播放音效
    按非降序建立n个元素的线性表
    Unity中的Transform.SetParent()API
    带头结点的两个链表La,Lb,将两个链表合并到La中,并且不破坏Lb的结构
    不带头结点的两个链表合并为一个链表
    二叉树的相关操作(c语言)
    关于ajax请求数据,并将数据赋值给全局变量的一些解决方法
    SummerVocation_Leaning--java动态绑定(多态)
  • 原文地址:https://www.cnblogs.com/libin6505/p/10769349.html
Copyright © 2011-2022 走看看