2016-05-06 10 views
1

Проблема:Перестановка файла журнал на основе ключевых слов

Я регулярно работать с большими файлами журнал, и я хотел бы организовать некоторые данные, относящиеся к, которые получают, написанные спорадический через файл вместе, чтобы потенциально отслеживать проблемы проще.

Пример данных, записанных в файл журнала:

1. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 
2. 2016-05-05 15:07:54,993 DEBUG (default task-16) ==> More stuff written on this line. 
3. 2016-05-05 15:07:54,993 DEBUG (default task-2) ==> More stuff written on this line. 
4. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
5. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 
6. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
7. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
8. 2016-05-05 15:07:54,993 DEBUG (default task-2) ==> More stuff written on this line. 
9. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
10. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 
11. 2016-05-05 15:07:54,993 DEBUG (default task-6) ==> More stuff written on this line. 
12. 2016-05-05 15:07:54,993 DEBUG (default task-3) ==> More stuff written on this line. 
13. 2016-05-05 15:07:54,993 DEBUG (default task-2) ==> More stuff written on this line. 
14. 2016-05-05 15:07:54,993 DEBUG (default task-14) ==> More stuff written on this line. 
15. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 

Я, естественно, решили использовать (по умолчанию Задачи- NUMBER), как мой идентификатор для группирования связанных строк вместе.

Я построил свой пользовательский интерфейс, и идея в том, что я хотел бы извлечь извлечение из исходного файла журнала, а затем вставить его в jTextArea в мое приложение Java, нажать кнопку и, как магия, все соответствующие номера задач (по умолчанию - NUMBER) будут сгруппированы вместе. (На первый простой println сгруппированных данных в моем IDE этих данных было бы идеально, конечно)

Я сейчас работаю на метод, который принимает весь текст вставленный в jTextArea и работает через него, созданную строку массив, который я позже расширить, чтобы найти любое количество номеров задач, в настоящее время он выдвигает на первый план все цифры, которые он находит, (не уверен, если я на правильном пути, хотя):

import java.awt.Color; 
import javax.swing.JTextArea; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.Document; 

public class ArrangeLogic { 

    public void groupLogFile(JTextArea theLogs) { 

     String[] myStringArray = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35"}; 

     for (int i = 0; i < myStringArray.length - 1; i++) { 

      String element = myStringArray[i]; 
      String nextElement = myStringArray[i + 1]; 

      String defaultTaskOdd = ("(default task-" + element + ")"); 
      String defaultTaskEven = ("(default task-" + nextElement + ")"); 
      System.out.println(defaultTaskOdd); 
      System.out.println(defaultTaskEven); 

      try { 
       Document document = theLogs.getDocument(); 

       for (int index = 0; index + defaultTaskOdd.length() < document.getLength(); index++) { 
        String match = document.getText(index, defaultTaskOdd.length()); 

        if (defaultTaskOdd.equals(match)) { 

         javax.swing.text.DefaultHighlighter.DefaultHighlightPainter highlightPainter 
           = new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW); 
         theLogs.getHighlighter().addHighlight(index, index + defaultTaskOdd.length(), 
           highlightPainter); 

        } 
       } 

       for (int index = 0; index + defaultTaskEven.length() < document.getLength(); index++) { 
        String match = document.getText(index, defaultTaskEven.length()); 

        if (defaultTaskEven.equals(match)) { 

         javax.swing.text.DefaultHighlighter.DefaultHighlightPainter highlightPainter 
           = new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW); 
         theLogs.getHighlighter().addHighlight(index, index + defaultTaskEven.length(), 
           highlightPainter); 

        } 
       } 

      } catch (BadLocationException ex) { 
      } 

     } 

    } 
} 

Я играл вокруг с несколькими идеи на весь день (да, я очень начинающий разработчик) о том, как пройти через все линии и повторно группировать их вместе, пока не везет, поэтому я подумал, что попрошу совета. Любая помощь или предложения были бы весьма признательны. Благодарю.

(EDIT)

Ожидаемый результат (ЛИНИЯ ЧИСЛА НЕ ИМЕЕТ ЗНАЧЕНИЯ):

1. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 
5. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 
10. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 
15. 2016-05-05 15:07:54,993 DEBUG (default task-1) ==> More stuff written on this line. 

2. 2016-05-05 15:07:54,993 DEBUG (default task-16) ==> More stuff written on this line. 

3. 2016-05-05 15:07:54,993 DEBUG (default task-2) ==> More stuff written on this line. 
8. 2016-05-05 15:07:54,993 DEBUG (default task-2) ==> More stuff written on this line. 
13. 2016-05-05 15:07:54,993 DEBUG (default task-2) ==> More stuff written on this line. 

4. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
6. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
7. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 
9. 2016-05-05 15:07:54,993 DEBUG (default task-33) ==> More stuff written on this line. 

11. 2016-05-05 15:07:54,993 DEBUG (default task-6) ==> More stuff written on this line. 

12. 2016-05-05 15:07:54,993 DEBUG (default task-3) ==> More stuff written on this line. 

14. 2016-05-05 15:07:54,993 DEBUG (default task-14) ==> More stuff written on this line. 
+0

Так что вы хотите получить список номеров задач по умолчанию? – Cukic0d

+0

Мне нужна вся строка, я добавлю это к моему оригинальному сообщению, спасибо! – BernardV

+0

Извините, я не уверен, что хорошо понял ... Вам нужно получить каждую линию в зависимости от номера задачи по умолчанию? – Cukic0d

ответ

1

Ну, вы не делаете это по-хорошему.

Вместо использования цикла внутри цикла, который работает медленно, вы определенно должны использовать регулярное выражение. Тогда я Recommand использовать сканер, чтобы каждая строка один на один ...

Вот рабочий код explanated, как я решил эту проблему, вы можете добавить для себя подсвечивание вещь ...

public static void groupLogFile(JTextArea theLogs) { 
    //This is used to get each line one by one 
    Scanner sc = new Scanner(theLogs.getText()); 

    //We are using a HashMap to store the lines in function of the task numbers 
    HashMap<Integer, List<String>> map = new HashMap<Integer, List<String>>(); 

    //We are now reading each line one by one 
    while (sc.hasNextLine()) { 
     String line = sc.nextLine(); 
     //With this regex we get at group 2 the task number 
     Pattern pattern = Pattern.compile("(\\(default task-(\\d+)\\))"); 
     Matcher matcher = pattern.matcher(line); 
     if (matcher.find()) { 
      //Task number 
      int task_number = Integer.parseInt(matcher.group(2)); 
      //We get other lines with same task number (if exist) 
      List<String> get; 
      if(map.containsKey(task_number)){ 
       get = map.get(task_number); 
      } else { 
       get = new LinkedList<String>(); 
      } 
      get.add(line); 
      //We update the list 
      map.put(task_number, get); 
     } 
    } 
    sc.close(); 

    //Ordering the map by task number 
    Comparator<Integer> comparator = new Comparator<Integer>() { 
      public int compare(Integer o1, Integer o2) { 
       return o1.compareTo(o2); 
      } 
    }; 
    TreeMap<Integer, List<String>> ordered = new TreeMap<Integer, List<String>>(comparator); 
    ordered.putAll(map); 

    //Print results 
    for(Entry<Integer, List<String>> e : ordered.entrySet()){ 
     for(String s : e.getValue()) 
      System.out.println(s); 
    } 
} 
+0

Большое спасибо за вашу помощь по этому поводу, я попытаюсь вернуться к этой проблеме как можно скорее и отчитаться, если я получу это правильно. – BernardV

+0

По какой-то причине мой IDE не устраивает: 'HashMap > карта = новый HashMap >();' – BernardV

+0

* EDIT * извините фиксированный я импортировал неправильно :) Java. awt.List вместо java.util.List – BernardV

0

Может быть, вы можете проверить default task-x и получить x, разобрать его в int и добавить линии до myStringArray[x-1] = myStringArray[x-1] + "\n" + theLine; , а затем удалите первую строку из строки.

0

Спасибо за помощь в ответе Cukic0d! В случае, если кто-то хочет, чтобы увидеть, как печатать результаты в JTextArea вместо println:

//Clear theLogs (what was pasted into the UI)  
     theLogs.setText(""); 

//Print results   
     ordered.entrySet().stream().forEach((e) -> { 
      e.getValue().stream().map((s) -> { 
      //System.out.println(s); 
       return s; 
      }).forEach((s) -> { 
       theLogs.append(s+"\n"); 
      }); 
     });