2016-10-09 4 views
-3

다음 코드가 포함 된 로그 파일이 있습니다. 로그 파일을 입력으로 사용하고 UserName, 날짜를 필터링하고 no로 계산합니다. 배 클라이언트 단선, 클라이언트 연결 및 패킷의 모든 사용자 이름 떨어 ........ 로그 샘플 :로그 파일에서 데이터 추출

나는 독특한 목록 사용자가 필요
[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. 

. 매일 연결 별, Disconneced, Packet Drop 수를 별도로 표시합니다. 이것은 mayneed 일부 자바 코드와 정규식은 확실히.

출력 : 여기에

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 
+2

스택 오버 플로우에 오신 것을 환영합니다! 질문 개선을 위해 [질문하는 방법] (http://stackoverflow.com/help/how-to-ask)을 검토하십시오. 시도한 코드와받은 오류를 게시하십시오. 가능한 한 구체적이어야 더 나은 답변으로 이어질 것입니다. – David

답변

2

는 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; 
     } 
    } 
} 
+1

OP의 로그 크기에 따라 int가 카운터에 가장 적합한 유형이 아닐 수 있습니다. 완전한 완성을 위해 File Reader를 Starter 클래스에 추가하십시오. – UserF40

+1

나는 당신에게 동의합니다. 질문자를 위해 TODO로 보관할 수 없습니까? D? –