Java 从日志文件中提取数据
我有一个包含以下代码的日志文件。。。我想使用日志文件作为输入,过滤用户名、日期,并计算每个用户名的客户端断开连接、客户端连接和丢包次数。。。。。。。。 日志样本:Java 从日志文件中提取数据,java,regex,file-handling,Java,Regex,File Handling,我有一个包含以下代码的日志文件。。。我想使用日志文件作为输入,过滤用户名、日期,并计算每个用户名的客户端断开连接、客户端连接和丢包次数。。。。。。。。 日志样本: [ComputerC7] UserName:ABC1 id:02 | (11/22/2016 01:20:03) | Client connected. [ComputerC8] UserName:ABC2 id:01 | (11/24/2016 03:10:35) | Client disconnected. [Com
[ComputerC7] UserName:ABC1 id:02 | (11/22/2016 01:20:03) | Client connected.
[ComputerC8] UserName:ABC2 id:01 | (11/24/2016 03:10:35) | Client disconnected.
[ComputerC9] UserName:ABC5 id:04 | (11/25/2016 01:20:35) | Packet drop.
[ComputerC7] UserName:ABC1 id:02 | (11/22/2016 01:20:03) | Packet drop.
我需要有唯一的列表用户。并分别显示每天的连接、断开和丢包计数。这可能需要一些java代码和正则表达式
输出:
UserName: ABC1 Date:11/22/2016 Connected :1 Disconnected :0 Packet Drop:1
UserName: ABC2 Date:11/24/2016 Connected :0 Disconnected :1 Packet Drop:0
UserName: ABC5 Date:11/25/2016 Connected :0 Disconnected :0 Packet Drop:1
以下是您在SO中的第一个问题的完整答案。请确保你在以后的帖子中展示你的尝试 这是您需要尝试的正则表达式:
"UserName:([^\\s]*)(?:[^\\(]*)\\(([^\\s]*)[^\\|]*\\|\\s*([^\\.]*)"
为了获得您想要的结果,您可以尝试以下方法
package rejex;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author Maverick
*/
public class Starter {
public static HashMap<String, props> resultMap;
public static final String regex = "UserName:([^\\s]*)(?:[^\\(]*)\\(([^\\s]*)[^\\|]*\\|\\s*([^\\.]*)";
public static final String string = "[ComputerC7] UserName:ABC1 id:02 | (11/22/2016 01:20:03) | Client connected.\n\n"
+ "[ComputerC8] UserName:ABC2 id:01 | (11/24/2016 03:10:35) | Client disconnected.\n\n"
+ "[ComputerC9] UserName:ABC5 id:04 | (11/25/2016 01:20:35) | Packet drop.\n\n"
+ "[ComputerC7] UserName:ABC1 id:02 | (11/22/2016 01:20:03) | Packet drop.\n\n";
public static void main(String[] args) {
Starter starter = new Starter();
starter.process();
for (String key : resultMap.keySet()) {
System.out.print(key);
System.out.print(" Connected :" + resultMap.get(key).clientConnected);
System.out.print(" Disconnected :" + resultMap.get(key).clientDisconnected);
System.out.println(" Packet Drop :" + resultMap.get(key).packetDrop);
}
}
public void process() {
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
String key = "";
resultMap = new HashMap<String, props>();
while (matcher.find()) {
key = "UserName: " + matcher.group(1) + " Date:" + matcher.group(2);
if (resultMap.containsKey(key)) {
resultMap.put(key, resultMap.get(key).increment(matcher.group(3)));
} else {
resultMap.put(key, new props().increment(matcher.group(3)));
}
}
}
public class props {
int clientDisconnected;
int clientConnected;
int packetDrop;
public props increment(String val) {
if (val.contains("disconnected")) {
clientDisconnected += 1;
} else if (val.contains("connected")) {
clientConnected += 1;
} else if (val.contains("drop")) {
packetDrop += 1;
}
return this;
}
}
}
欢迎来到堆栈溢出!请复习以改进您的问题。张贴您尝试过的代码和收到的错误。尽可能具体,因为这将导致更好的答案。根据OP处理的日志大小,int可能不是计数器的最佳类型。另外,为了完整起见,在初学者课程中添加一个文件读取器。我同意你的观点。我们不能把它作为提问者的待办事项:D?