我有一个MySQL日志文件,其中包含每个文件的各种信息(当建立连接,进行查询时,连接结束时等)我必须解析日志文件以便我可以每行的数据,把它放在一个数组中,然后根据它进行一些计算。
以下是日志文件中的示例:
151011 12:52:51 1 Connect user@127.0.0.1 on testdb
1 Query SHOW SESSION VARIABLES
1 Query SHOW COLLATION
1 Query SET character_set_results = NULL
1 Query SET autocommit=1
1 Query SELECT q1,q2 FROM q_table
1 Query SELECT s1,s2 FROM s_table
1 Query select count(*) as c from i_table WHERE val = 1
1 Query select count(*) as c from k_table WHERE cid = 1
1 Query SELECT name,age FROM i_table WHERE ck = 1
151011 12:52:54 1 Query SELECT name,aid FROM j_table WHERE co = 1
151011 12:52:59 1 Query SELECT * from values where lastname='smith'
不幸的是,行中的空格没有用制表符分隔(" \ t")。更糟糕的是,有些线路在开始时有额外的日期和时间,而有些则没有。这意味着某些行有更多数据要解析。我该如何解析这个日志文件?
到目前为止,我有以下内容:
Scanner scan = new Scanner(new File("data.log"));
ln = scan.nextLine();
ar = ln.split("\t");
System.out.println(ar[0]);
System.out.println(ar[1]);
但是会打印以下行,例如:
151018 12:52:51 // First slot in the array
1 Connect user@127.0.0.1 on tested // Second slot in the array
有没有办法做到这一点?或者是不可能的?
答案 0 :(得分:2)
对我来说,你想要使用由空格分隔的以下组进行正则表达式:
以非空格开头并继续使用
的组String dateTime, number, type, message;
Pattern pattern = Pattern.compile(
"(\\d{6} \\d{2}:\\d{2}:\\d{2})?\\s+(\\d+)\\s+(Connect|Query)\\s+([^\\s].*)");
Matcher matcher = pattern.matcher(ln);
if (matcher.matches()) {
dateTime = matcher.group(1);//this will be null if no date
number = matcher.group(2);
type = matcher.group(3);
message = matcher.group(4);
}