2016-10-09 12 views
-3

次のコードを含むログファイルがあります。ログファイルを入力として使用し、UserName、日付をフィルタし、noを数えます。倍のクライアントの切断、クライアント接続とパケットのEVERY usernameの低下........ ログサンプル:ログファイルからデータを抽出する

私はユニークなリストのユーザーを持っている必要があります
[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 
+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がカウンターに最適なタイプではない可能性があります。完全な完全性のために、StarterクラスにFileリーダーを追加してください。 – UserF40

+1

私はあなたに同意します。質問者のためにこれをTODOにしておくことはできません:D? –

関連する問題