簡體   English   中英

使用 Java 將日志解析為 csv

[英]Parse log to csv with Java

我正在嘗試解析我的日志文件並使用給定的正則表達式模式導出到 csv,但是數據輸入發生了變化,我怎樣才能准確地找到模式並寫入 csv 文件。

模式: (PT.a=.PT=b, ...) 以 & 結尾

日志文件:

 2022-06-06 9:09:07 PT.a=xxx&PT.b=xxx&PT.c=&PT.d=xxx&PT.e=xxx&PT.f=xxx&PT.g=xxx&PT.h=xxx&PT.i=xxx&PT.j=xxx&PT.k=xxx&PT.l=xxx&PT.m=xxx&PT.n=xxx&PT.o=xxx&PT.p=xxx&PT.q=xxx&PT.r=xxx&PT.s=xxx&PT.t=xxx&PT.u=xxx&PT.v=xxx&PT.w=xxx&PT.x=xxx&PT.y=xxx&PT.z=xxx&PT.ab=xxx&PT.ac=xxx&PT.ad=xxx&PT.ae=xxx&PT.af=xxx
 2022-06-06 10:09:07 PT.a=xxx&PT.b=xxx&PT.c=xxx&PT.d=xxx&PT.e=xxx&PT.f=xxx&PT.g=xxx&PT.h=xxx&PT.i=xxx&PT.j=xxx&PT.k=xxx&PT.x=xxx&PT.y=xxx&PT.z=xxx&PT.ab=xxx&PT.ac=xxx&PT.ad=xxx&PT.ae=xxx&PT.af=xxx
 2022-06-06 11:09:07 PT.a=xxx&PT.b=xxx&PT.c=&PT.d=xxx&PT.e=xxx&PT.f=xxx&PT.g=xxx&PT.h=xxx&PT.i=xxx
 2022-06-06 12:09:07 PT.a=xxx&PT.b=xxx&PT.e=xxx&PT.f=xxx&PT.g=xxx&PT.h=xxx&PT.i=xxx

csv 輸出

 2022-06-9:09:07,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx
 2022-06-06 10:09:07,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx
 2022-06-06,12:09:07,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx
 2022-06-06 11:09:07,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx
 2022-06-06,12:09:07,xxx,xxx,,,xxx,xxx,xxx,xxx,xxx
import java.io.*;
import java.util.*;
public class readLog {
    public static void main(String[] args) {
        try{
            BufferedReader in = new BufferedReader(new FileReader("/Users/user/Desktop/log0601.log"));
            FileWriter out = new FileWriter("/Users/user/Desktop/csv0601.csv");
            String str;
            while((str=in.readLine()) != null) {
                str = str.replaceAll(" PT.a=|PT.b=|PT.c=|PT.d|PT.e=|PT.f=|PT.g=|PT.h=|PT.i=|PT.j=|PT.k=|PT.l=|PT.m=|PT.n=|PT.o|PT.p=|PT.q=|PT.r=|PT.s=|PT.t=|PT.u=|PT.v=|PT.w=|PT.x=|PT.y=|PT.z=|PT.ab=|PT.ac=|PT.ad=|PT.ae=|PT.af=| ", ",").replace("&","");
                System.out.println(str);
                out.write(str);
                out.append("\n");
            }
            out.close();
        }
    
        catch (IOException e) {
        }
    }
    
}

也許是這樣的?

import java.util.Scanner;
import java.util.Arrays;
import java.util.stream.*;
import java.io.Reader;
import java.io.StringReader;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class LogParser {
    public static void main(String[] args) {
        try {
            String logFileString = """
2022-06-06 9:09:07 PT.a=xxx&PT.b=xxx&PT.c=&PT.d=xxx&PT.e=xxx&PT.f=xxx&PT.g=xxx&PT.h=xxx&PT.i=xxx&PT.j=xxx&PT.k=xxx&PT.l=xxx&PT.m=xxx&PT.n=xxx&PT.o=xxx&PT.p=xxx&PT.q=xxx&PT.r=xxx&PT.s=xxx&PT.t=xxx&PT.u=xxx&PT.v=xxx&PT.w=xxx&PT.x=xxx&PT.y=xxx&PT.z=xxx&PT.ab=xxx&PT.ac=xxx&PT.ad=xxx&PT.ae=xxx&PT.af=xxx
 2022-06-06 10:09:07 PT.a=xxx&PT.b=xxx&PT.c=xxx&PT.d=xxx&PT.e=xxx&PT.f=xxx&PT.g=xxx&PT.h=xxx&PT.i=xxx&PT.j=xxx&PT.k=xxx&PT.x=xxx&PT.y=xxx&PT.z=xxx&PT.ab=xxx&PT.ac=xxx&PT.ad=xxx&PT.ae=xxx&PT.af=xxx
 2022-06-06 11:09:07 PT.a=xxx&PT.b=xxx&PT.c=&PT.d=xxx&PT.e=xxx&PT.f=xxx&PT.g=xxx&PT.h=xxx&PT.i=xxx
 2022-06-06 12:09:07 PT.a=xxx&PT.b=xxx&PT.e=xxx&PT.f=xxx&PT.g=xxx&PT.h=xxx&PT.i=xxx
            """;                
            LogParser logParser = new LogParser();
            // Usage java LogParser [input file] [ouput csv file]
            // Usage java LogParser 
            // The latter will just run the demo data in the app to stdout
            if (args.length < 2) {
                try (PrintWriter out = new PrintWriter(System.out)) {
                    logParser.logFile2Csv(new StringReader(logFileString), out);
                }
            }
            else {
                Path logFile = Paths.get(args[0]);
                Path csvFile = Paths.get(args[1]);
                try (Reader in = Files.newBufferedReader(logFile)) {
                    try (PrintWriter out = new PrintWriter(Files.newBufferedWriter(csvFile))) {
                        logParser.logFile2Csv(in, out);
                    }
                }
            }
        }
        catch(Throwable t) {
            t.printStackTrace();
        }
    }

    public void logFile2Csv(Reader logReader, PrintWriter csvPrinter) {
        final String SPLIT_PAT = "&?PT\\.[a-z]+=";
        Scanner lines = new Scanner(logReader);
        while (lines.hasNextLine()) {
            String[] fields = lines.nextLine().split(SPLIT_PAT);
            String outLine = Arrays.stream(fields).map(String::trim).collect(Collectors.joining(","));
            csvPrinter.println(outLine);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM