Программа для подсчета повторяющихся строк в текстовом файле

import java.io.*;
import java.util.*;

public class lineCount {

public static void main(String[] args) {
     Map<String,Integer>  countMap= new HashMap<String,Integer>();

        try (BufferedReader  br= new BufferedReader(new FileReader(new File("error.txt"))))
        {

            String data="";
            while ((data=br.readLine())!=null) {

                if(countMap.containsKey(data)) {
                    countMap.put(data, countMap.get(data)+1);
                }else {
                    countMap.put(data, 1);
                }

            }

            countMap.forEach((k,v)->{System.out.println("Error: "+k+" Occurs "+v+" times.");});

        } catch (IOException  e) {
            e.printStackTrace();
        }

}

}

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

Я все сделал, но не знаю, как игнорировать дату и время. Может ли кто-нибудь мне помочь


текстовый файл

 ERROR  [CompactionExecutor:21454] 2018-10-29 12:02:41,906 NoSpamLogger.java:91 - Maximum memory usage reached (125.000MiB), cannot allocate chunk of 1.000MiB
 ERROR  [CompactionExecutor:21454] 2018-10-29 12:02:41,906 NoSpamLogger.java:91 - Maximum memory usage reached (125.000MiB), cannot allocate chunk of 1.000MiB
 ERROR  [CompactionExecutor:21454] 2018-10-29 12:02:41,906 NoSpamLogger.java:91 - Maximum memory usage reached (125.000MiB), cannot allocate chunk of 1.000MiB
 ERROR  [CompactionExecutor:21454] 2018-10-29 12:02:41,906 NoSpamLogger.java:91 - Maximum memory usage reached (125.000MiB), cannot allocate chunk of 1.000MiB
 ERROR  [CompactionExecutor:21454] 2018-10-29 12:02:41,906 NoSpamLogger.java:91 - Maximum memory usage reached (125.000MiB), cannot allocate chunk of 1.000MiB
 2018-09-20 14:08:14.571 [main] ERROR org.apache.flink.yarn.YarnApplicationMasterRunner  -     -Dlogback.configurationFile=file:logback.xml
 2018-09-20 14:08:14.571 [main] ERROR  org.apache.flink.yarn.YarnApplicationMasterRunner  -     -Dlogback.configurationFile=file:logback.xml
 ERROR  [CompactionExecutor:21454] 2018-10-29 12:02:41,906 NoSpamLogger.java:91 - Maximum memory usage reached (125.000MiB), cannot allocate chunk of 1.000MiB
 ERROR  [CompactionExecutor:21454] 2018-10-29 12:02:41,906 NoSpamLogger.java:91 - Maximum memory usage reached (125.000MiB), cannot allocate chunk of 1.000MiB
 ERROR  [CompactionExecutor:21454] 2018-10-29 12:02:41,906 NoSpamLogger.java:91 - Maximum memory usage reached (125.000MiB), cannot allocate chunk of 1.000MiB
 2018-10-29T12:01:00Z E! Error in plugin [inputs.openldap]: LDAP Result Code 32 "No Such Object": 
 2018-10-29T12:01:00Z E! Error in plugin [inputs.openldap]: LDAP Result Code 32 "No Such Object": 
 2018-10-29T12:01:00Z E! Error in plugin [inputs.openldap]: LDAP Result Code 32 "No Such Object": 
 2018-10-29T12:01:00Z E! Error in plugin [inputs.openldap]: LDAP Result Code 32 "No Such Object": 
 2018-10-29T12:01:00Z E! Error in plugin [inputs.openldap]: LDAP Result Code 32 "No Such Object": 
 2018-10-29T12:01:00Z E! Error in plugin [inputs.openldap]: LDAP Result Code 32 "No Such Object": 
 2018-10-29T12:01:00Z E! Error in plugin [inputs.openldap]: LDAP Result Code 32 "No Such Object": 
 2018-10-29T12:01:00Z E! Error in plugin [inputs.openldap]: LDAP Result Code 32 "No Such Object": 
 ERROR  [CompactionExecutor:21454] 2018-10-29 12:02:41,906 NoSpamLogger.java:91 - Maximum memory usage reached (125.000MiB), cannot allocate chunk of 1.000MiB
 2018-09-20 14:08:14.571 [main] ERROR  org.apache.flink.yarn.YarnApplicationMasterRunner  -     -Dlogback.configurationFile=file:logback.xml
 2018-09-20 14:08:14.571 [main] ERROR  org.apache.flink.yarn.YarnApplicationMasterRunner  -     -Dlogback.configurationFile=file:logback.xml
 2018-09-20 14:08:14.571 [main] ERROR  org.apache.flink.yarn.YarnApplicationMasterRunner  -     -Dlogback.configurationFile=file:logback.xml
 2018-09-20 14:08:14.571 [main] ERROR  org.apache.flink.yarn.YarnApplicationMasterRunner  -     -Dlogback.configurationFile=file:logback.xml
 2018-09-20 14:08:14.571 [main] ERROR  org.apache.flink.yarn.YarnApplicationMasterRunner  -     -Dlogback.configurationFile=file:logback.xml
 "2018-10-16 19:54:26.691 [RawEventProcessor (2/2)] ERROR com.qolsys.iqcloud.processing.operators.RawEventProcessor1  - processRawPanelEvent():: SerialNumber systemSerialNumber: QV01D173700428AD is not mapped to any meid. {}",2
 "2018-10-16 19:54:27.074 [RawEventProcessor (2/2)] ERROR com.qolsys.iqcloud.processing.operators.RawEventProcessor1  - processRawPanelEvent():: SerialNumber systemSerialNumber: QV01D173700428AD is not mapped to any meid. {}",2
 "2018-10-16 19:54:27.293 [RawEventProcessor (2/2)] ERROR com.qolsys.iqcloud.processing.operators.RawEventProcessor1  - processRawPanelEvent():: SerialNumber systemSerialNumber: QV01D173700428AD is not mapped to any meid. {}",2
 "2018-10-16 19:54:27.296 [RawEventProcessor (2/2)] ERROR com.qolsys.iqcloud.processing.operators.RawEventProcessor1  - processRawPanelEvent():: SerialNumber systemSerialNumber: QV01D173700428AD is not mapped to any meid. {}",2
 "2018-10-16 19:54:27.471 [RawEventProcessor (2/2)] ERROR com.qolsys.iqcloud.processing.operators.RawEventProcessor1  - processRawPanelEvent():: SerialNumber systemSerialNumber: QV01D173700428AD is not mapped to any meid. {}",2
 "2018-10-16 19:54:27.570 [RawEventProcessor (2/2)] ERROR com.qolsys.iqcloud.processing.operators.RawEventProcessor1  - processRawPanelEvent():: SerialNumber systemSerialNumber: QV01D173700428AD is not mapped to any meid. {}",2
 "2018-10-16 19:54:27.574 [RawEventProcessor (2/2)] ERROR com.qolsys.iqcloud.processing.operators.RawEventProcessor1  - processRawPanelEvent():: SerialNumber systemSerialNumber: QV01D173700428AD is not mapped to any meid. {}",2
 "2018-10-16 19:54:27.574 [RawEventProcessor (2/2)] ERROR com.qolsys.iqcloud.processing.operators.RawEventProcessor1  - processRawPanelEvent():: SerialNumber systemSerialNumber: QV01D173700428BD is not mapped to any meid. {}",2
 "2018-10-16 19:54:27.574 [RawEventProcessor (2/2)] ERROR com.qolsys.iqcloud.processing.operators.RawEventProcessor1  - processRawPanelEvent():: SerialNumber systemSerialNumber: QV01D173700428BD is not mapped to any meid. {}",2

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

adickinson 31.10.2018 13:06

Чтобы игнорировать дату и время, взгляните на регулярные выражения (также известные как «регулярное выражение») для поиска по строкам. Это позволит вам распознать и удалить дату / время из строки, если она есть. Затем обработайте оставшийся текст обычным образом, чтобы распознать дубликаты.

rossum 31.10.2018 13:13

@Andrew Хранение хэшей небезопасно. Несколько строк сопоставляются с одним и тем же хешем из-за принципа ячейки. Существующие алгоритмы (хэш-карта например), использующие хеши, обходятся стороной, потому что это проверка предварительный, после которой фактические объекты сравниваются с equals(), когда хеш-код совпадает.

Mark Jeronimus 31.10.2018 13:17

@MarkJeronimus У вас есть источники, которые я могу прочитать? «Принцип голубятни» кажется слишком расплывчатым, чтобы возвращать соответствующий материал.

adickinson 31.10.2018 13:19

Попробуйте первый результат поиска - Википедия. Для более подробного объяснения см. stackoverflow.com/questions/7417668/…

Mark Jeronimus 01.11.2018 12:02
0
5
459
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

List<String> lines = Files.readAllLines(new File("error.txt").toPath());
String timestampRegex = "\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2}(,|.)\\d{3}";
Map<String, Long> map = lines.stream().map(e -> e.replaceAll(timestampRegex, ""))
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
Ответ принят как подходящий

заменить data=data.trim(); на data=extractString(data.trim());

public static String extractString(String input) {

        String regEx ="(.*)([ ]*\\d{4}-\\d{2}-\\d{2}[\\s|T]\\d{2}:\\d{2}:\\d{2}(?:(?:[,.]{1}\\d{0,3})|(?:[Z]{1}))[ ]*)(.*)";
        Matcher matcher = Pattern.compile(regEx).matcher(input);            

        String output="";
        if(matcher.matches()) { 
            output= matcher.group(1)+matcher.group(3);              
        }else {
            output=input;
        }   

        return output.trim();
 }

Выход :

Occurs 7 times :: "[RawEventProcessor (2/2)] ERROR com.qolsys.iqcloud.processing.operators.RawEventProcessor1  - processRawPanelEvent():: SerialNumber systemSerialNumber: QV01D173700428AD is not mapped to any meid. {}",2
Occurs 1 times :: [main] ERROR org.apache.flink.yarn.YarnApplicationMasterRunner  -     -Dlogback.configurationFile=file:logback.xml
Occurs 2 times :: "[RawEventProcessor (2/2)] ERROR com.qolsys.iqcloud.processing.operators.RawEventProcessor1  - processRawPanelEvent():: SerialNumber systemSerialNumber: QV01D173700428BD is not mapped to any meid. {}",2
Occurs 8 times :: E! Error in plugin [inputs.openldap]: LDAP Result Code 32 "No Such Object":
Occurs 6 times :: [main] ERROR  org.apache.flink.yarn.YarnApplicationMasterRunner  -     -Dlogback.configurationFile=file:logback.xml
Occurs 9 times :: ERROR  [CompactionExecutor:21454] NoSpamLogger.java:91 - Maximum memory usage reached (125.000MiB), cannot allocate chunk of 1.000MiB

Ниже приведены пояснения к выходным данным, приведенным здесь.

  • 1-я и 3-я строки могут выглядеть одинаково, но есть разница в строках QV01D173700428AD и QV01D173700428BD в этих строках
  • 2-я и 5-я строки также могут выглядеть одинаково, но есть разница в пробеле в данном вводе после слова ОШИБКА и перед org.apache.flink.yarn

    [main] ERROR org.apache.flink.yarn

Нарушение регулярного выражения

Каждая запись журнала разделена на 3 группы, причем вторая группа представляет метку времени. и 1-я и 3-я группы представляют любые символы.

В приведенном выше журнале ошибок есть три типа отметок времени:

2018-10-29 12:02:41,906

2018-09-20 14:08:14.571

2018-10-29T12:01:00Z

Ниже приведено нарушение RegEx

Группа 1 - соответствует любому персонажу (.*)

Группа 2 - соответствует отметке времени ([ ]*\\d{4}-\\d{2}-\\d{2}[\\s|T]\\d{2}:\\d{2}:\\d{2}(?:(?:[,.]{1}\\d{0,3})|(?:[Z]{1}))[ ]*)

Группа 3 - соответствует любому персонажу (.*)

В коде Java группа 2 [метка времени] игнорируется, и учитываются только группы 1 и 2.

Разрывная группа 2:


[ ]* 0 или более пробелов

\\d{4} 2 цифровых символа

- дефис

\\d{2} 2 цифровых символа

- дефис

\\d{2} 2 цифровых символа

[\\s|T] пробел или символ 'T'

\\d{2} 2 цифровых символа

: толстой кишки

\\d{2} 2 цифровых символа

: толстой кишки

\\d{2} 2 цифровых символа

(?:(?:[,.]{1}\\d{0,3})|(?:[Z]{1})) Для соответствия либо ",", либо ".", за которым следуют 3 цифровых символа ИЛИ символ "Z"

[ ]* 0 или более пробелов


Здесь ( ) - это группа захвата, а (?: ) - группа без захвата. Чтобы узнать больше о группировках в RegEx. Пожалуйста, обратитесь к https://www.regular-expressions.info/refcapture.html или другим ресурсам

Он не работает для последних 9 строк в текстовом файле, который я дал выше.

Pavan 01.11.2018 06:44

Позвольте мне изменить @Pavan

Deepak Gunasekaran 01.11.2018 06:46

@Pavan Проверьте мой вывод с вашим выводом для данного входного текста. и дайте мне знать различия

Deepak Gunasekaran 01.11.2018 06:51

да, он работает, но 1-я и 3-я строки - схожие ошибки. поэтому их обоих следует рассматривать как одно целое.

Pavan 01.11.2018 08:46

@Pavan Но между первой и третьей строками разница в 1 символ. QV01D173700428AD в 1-й строке был изменен на QV01D173700428BD в 3-й строке

Deepak Gunasekaran 01.11.2018 08:47

Хорошо, я соглашусь с вами. То, что я говорю, ошибка такая же, но отличается только идентификатор, поэтому мне также нужно игнорировать этот идентификатор

Pavan 01.11.2018 09:44

@Pavan Да, я понял, но все же каждый оператор ошибки будет иметь другой шаблон, и в эти операторы могут быть вставлены некоторые динамические значения, которые делают их разными строками. Так что будет трудно справиться с подобными случаями, не зная всех этих закономерностей.

Deepak Gunasekaran 01.11.2018 10:01

Спасибо, что помогли мне, но есть ли возможность пренебречь этим идентификатором, если он есть

Pavan 01.11.2018 10:03

если бы мы это сделали, это было бы похоже на написание разных регулярных выражений для каждого шаблона. Если таких шаблонов журнала будет n, то будет n различных регулярных выражений. Здесь для 1-го и 3-го одно регулярное выражение, а для 2-го и 5-го будет другое регулярное выражение, если мы это сделаем.

Deepak Gunasekaran 01.11.2018 10:08

Хорошо, нет проблем, и вы можете объяснить мне вышеприведенное решение, которое вы предоставили.

Pavan 01.11.2018 10:10

Конечно. Позвольте мне расширить ответ

Deepak Gunasekaran 01.11.2018 10:11

Хорошо, разверни, и я пойму.

Pavan 01.11.2018 10:15

Другие вопросы по теме