2016-10-09 3 views
-3

У меня есть файл журнала, который содержит следующий код ... Я хочу использовать файл журнала в качестве входных данных и фильтровать UserName, дату и подсчет no. в раз Client разъединение, соединение клиента и отбрасывания пакетов ДЛЯ КАЖДОГО 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. – UserF40

+1

Я согласен с тобой. Разве мы не можем держать его как TODO для вопрошающего: D? –

Смежные вопросы