2016-09-29 2 views
1

У меня есть файл журнала, где 2 записи принадлежат вместе с тем же ID:Sorted Читайте в с BufferedReader

2016-09-29 10:50:48.377 [http-100-exec-1] 4711 ffb0dbcc-2615-40f8 request-log... 
2016-09-29 10:50:48.377 [http-100-exec-1] 4711 ffb0dbcc-2615-40f8 response-log... 
2016-09-29 10:50:47.749 [http-100-exec-1] 4711 5af0cc2f-5525-4748 request-log... 
2016-09-29 10:50:47.867 [http-100-exec-1] 4711 fc2f7ff6-da1e-4309 request-log... 
2016-09-29 10:50:47.758 [http-100-exec-1] 4711 5af0cc2f-5525-4748 response-log... 
2016-09-29 10:50:47.873 [http-100-exec-1] 4711 fc2f7ff6-da1e-4309 response-log... 

Теперь я хочу, чтобы открыть этот файл с BufferedReader и разобрать каждую строку в отсортированный таблицу. Каждая анализируемая строка должна сортироваться по идентификатору (2 записи всегда имеют одинаковый идентификатор) (последний столбец, например ffb0dbcc-2615-40f8), в таблице.

Как это сделать?

ответ

1

Один из вариантов здесь - использовать отсортированную карту для хранения каждой строки из файла журнала.

Update:

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

Например, две записи с ID ffb0dbcc-2615-40f8 могут иметь ключи ffb0dbcc-2615-40f8-0 и ffb0dbcc-2615-40f8-1.

Map<String, String> map = new TreeMap<>(); 

BufferedReader br = null; 

try { 
    String line; 

    br = new BufferedReader(new FileReader("C:\\log.txt")); 

    int counter = 0; 
    while ((line = br.readLine()) != null) { 
     String key = line.split("\\s+")[4]; 
     key = key + "-" + counter; 
     map.put(key, line); 
     ++counter; 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     if (br != null) br.close(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

// now you can iterate over the log statements in order by ID 
for (Map.Entry<String,String> entry : map.entrySet()) { 
    System.out.println(entry.getKey() + " => " + entry.getValue()); 
} 
+0

Эта функция печати только половина записей. 2 У записей всегда одинаковый идентификатор, они будут перезаписаны? – Drextor

+0

@Drextor Можно ли отличить две такие записи, или они полностью идентичны? –

+0

Это 2 записи имеют только тот же идентификатор ... за этим идентификатором является журнал запросов, а за вторым идентификатором записи - журнал ответов ... Я хочу отсортировать это, потому что позже я бы поставил оба журнала вместе. .Это проще с отсортированными данными – Drextor

1

Использование потоков

public static List<String> getSortedLines(String path) throws IOException { 
    return Files.lines(Paths.get(path)) 
     .sorted((line1, line2) -> get5thWord(line1).compareTo(get5thWord(line2))) 
     .collect(Collectors.toList()); 
} 

public static String get5thWord(String line) { 
    return line.split(" ")[4]; 
}