利用字符缓冲流读取文件内容并筛选数据

2022-06-30 14:48:54

目前实习,接到领导给安排的任务,将log日志文件中的sql语句整理出来(包含按条件筛选截取,去重),数据有20万条,所以我考虑用IO流去解决

这块我使用的是字符缓冲流去读取BufferedReader和写入BufferedWriter

先去读取文件夹

	FileReader reader=newFileReader("D:\\Program Files\\xxx\\sql.log");

读取文件中的数据,并存入到一个字符串中,便于做筛选、去重等操作

	BufferedReader br=newBufferedReader(reader);
    String text= null;
    List<String> list=newArrayList<>();.........
    list.add(text);

筛选,截取数据

sql语句示范:2021-02-07 17:48:58 slow sql 0 millis. SELECT count(0) FROM org_unit_relation WHERE ((from_org_id = ?) AND (from_business_id <> ?))[-1730833917365171641,158912402929426432]

//取数据while((text= br.readLine())!= null){
        k++;//筛选前//筛选:只要sql语句中包含 millis. SELECT 和 FROM org_ 或者 millis. select 和 from org_ 就选中(区别就是大小写)if((text.contains("millis. SELECT")&& text.contains("FROM org_"))||(text.contains("millis. select")&& text.contains("from org_"))){//截取:这里判断是否包含 [if(text.indexOf("[")==-1){//不包含,那么就从SELECT或者select开始截取
               text= text.contains("SELECT")? text.substring(text.indexOf("SELECT")): text.substring(text.indexOf("select"));}else{//包含,那么就从SELECT或者select开始截取,到 [ 结束
               text= text.contains("SELECT")? text.substring(text.indexOf("SELECT"), text.indexOf("[")): text.substring(text.indexOf("select"), text.indexOf("["));}
            i++;//筛选后
            list.add(text);//添加到字符串中}}
        br.close();

去重

//去除重复元素
    List<String> list1=newArrayList<>();for(String item: list){if(!list1.contains(item)){
            list1.add(item);
            j++;}}

将数据存入到备用文件,遍历(换行)

	BufferedWriter bw=newBufferedWriter(newFileWriter("D:\\Program Files\\xxx\\sql备份.log"));//遍历for(String s: list1){
        bw.write(s+"\r\n");}
    bw.close();

至此,任务完成

完整代码展示

/**
 * @Author: jl
 * @Version: 1.0
 * @Date: 2021/01/22 9:32
 */publicclassFileFilter1{publicstaticvoidmain(String[] args)throws IOException{
        BufferedWriter bw=newBufferedWriter(newFileWriter("D:\\Program Files\\xxx\\sql备份.log"));

        FileReader reader= null;int k=0;//筛选前int i=0;//筛选后int j=0;//去重后try{
            reader=newFileReader("D:\\Program Files\\xxx\\sql.log");
            BufferedReader br=newBufferedReader(reader);
            String text= null;
            List<String> list=newArrayList<>();//取数据while((text= br.readLine())!= null){
                k++;//筛选:只要sql语句中包含 millis. SELECT 和 FROM org_ 或者 millis. select 和 from org_ 就选中(区别就是大小写)if((text.contains("millis. SELECT")&& text.contains("FROM org_"))||(text.contains("millis. select")&& text.contains("from org_"))){//截取:这里判断是否包含 [if(text.indexOf("[")==-1){//不包含,那么就从SELECT或者select开始截取
                        text= text.contains("SELECT")? text.substring(text.indexOf("SELECT")): text.substring(text.indexOf("select"));}else{//包含,那么就从SELECT或者select开始截取,到 [ 结束
                        text= text.contains("SELECT")? text.substring(text.indexOf("SELECT"), text.indexOf("[")): text.substring(text.indexOf("select"), text.indexOf("["));}
                    i++;
                    list.add(text);}}
            br.close();//去除重复元素
            List<String> list1=newArrayList<>();for(String item: list){if(!list1.contains(item)){
                    list1.add(item);
                    j++;}}
            System.out.println("筛选前"+ k);
            System.out.println("筛选后"+ i);
            System.out.println("去重后"+ j);//遍历for(String s: list1){
                bw.write(s+"\r\n");}
            bw.close();}catch(FileNotFoundException e){
            e.printStackTrace();}catch(IOException e){
            e.printStackTrace();}}}
  • 作者:Surplus...
  • 原文链接:https://blog.csdn.net/m0_46861581/article/details/113762673
    更新时间:2022-06-30 14:48:54