2016-10-09 4 views
-3

Ich habe eine Protokolldatei, die den folgenden Code enthält ... Ich möchte die Protokolldatei als Eingabe verwenden und UserName, Datum filtern und no zählen. Mal Client-Trennung, Client-Verbindung und Packet fällt FÜR JEDEN NUTZERNAME ........ Log-Beispiel:Extrahieren von Daten aus der Protokolldatei

[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. 

ich eindeutige Liste Benutzer haben müssen. und zeigen Connected, Disconnected, Packet Drop-Zähler für jeden Tag separat an. Dies mayneed Einige Java-Code und Regex sicher.

Ausgang:

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

Willkommen bei Stack Overflow! Bitte lesen Sie [how to ask] (http://stackoverflow.com/help/how-to-ask), um Ihre Frage zu verbessern. Veröffentlichen Sie den Code, den Sie versucht haben, und die Fehler, die Sie erhalten haben. Sei so genau wie möglich, denn das führt zu besseren Antworten. – David

Antwort

2

Dies ist die komplette Antwort auf Ihre erste Frage SO. Bitte stellen Sie sicher, dass Sie zeigen, was Sie in der Zukunft Post versucht haben.

Dies ist der regex, die Sie versuchen müssen:

"UserName:([^\\s]*)(?:[^\\(]*)\\(([^\\s]*)[^\\|]*\\|\\s*([^\\.]*)" 

Und das Ergebnis zu erhalten, wie Sie Ihnen gewünschten den folgenden Ansatz versuchen.

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

Abhängig von der Größe der Protokolle, die OP abhandelt, ist int möglicherweise nicht der beste Typ für die Zähler. Um die Vollständigkeit zu gewährleisten, fügen Sie Ihrer Starter-Klasse einen Dateireader hinzu. – UserF40

+1

Ich stimme dir zu. Können wir es nicht einfach als TODO für den Fragesteller behalten: D? –

Verwandte Themen