Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从日志文件中提取数据_Java_Regex_File Handling - Fatal编程技术网

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?