Python: как удалить дубликаты / похожие строки - PullRequest
0 голосов
/ 16 апреля 2019

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

Error number 609 at line 10
Error number 609 at line 22
Error string "foo" at line 11
Error string "bar" at line 14

и хотелось бы, чтобы вывод был примерно таким:

Error number 609 at line 10
Error string "foo" at line 11

Это «тот же» тип ошибки.

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

То, что у меня сейчас есть:

from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

lst = open("result.txt").readlines()
print(len(lst))
for i in lst:
    for index, line in enumerate(lst):
        try:
            if similar(lst[index],lst[index + 1]) > 0.8:
                lst.pop(index)
        except:
            pass

print(len(lst))

Но это не верный метод, потому что это может быть избыточное количество циклов или этого может быть недостаточно, если файл действительно большой со многими «одинаковыми» строками.

РЕДАКТИРОВАТЬ:

Более точный пример одного из многих типов сообщений в файле будет что-то вроде:

[{TYPE}] Timeout after {miliseconds} millis, source ref: {random-number}, system: {system}, delivered {system}: , current {system}: {time}

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

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

[{TYPE}] Timeout after {miliseconds} millis, source ref: {random-number}...
lst = open("result.txt").readlines()

pretoken = "["
posttoken = "]"

foundTypes = []
log = []

for line in lst:
    foundType = ""
    for letter in line:
        if letter == pretoken: pass
        elif letter == posttoken: break
        else: foundType += letter

    if foundType not in foundTypes:
        foundTypes.append(foundType)
        log.append(line)

print(log)
1 голос
/ 16 апреля 2019

Вам просто нужно построчно открыть и прочитать файл журнала.

a=b=None
with open('result.txt') as infile:
    if a == None:
        a = infile.readline()
    b = infile.readline()
    while a:
        a = infile.readline()
        print('proc similar(a,b)')
        b = a
...