我有一个包含很多消息的文件。每行都有一条唯一的消息,该消息的结构将彼此相似,并稍加修改。一个示例如下:
library(tidyverse)
test %>%
group_by(A, B, C) %>%
mutate(rn = row_number()) %>%
spread(sp, tl) %>%
select(-rn)
# A tibble: 7 x 5
# Groups: A, B, C [9]
# A B C au cr
# <fct> <fct> <fct> <dbl> <dbl>
#1 30 x g NA 29
#2 32 y g NA 36
#3 32 y g NA 44
#4 32 y g NA 40
#5 35 z g 48 NA
#6 35 z g 54 NA
#7 35 z g 53 NA
,并希望输出为:
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))
答案 0 :(得分:1)
您只需要逐行打开并读取日志文件。
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
答案 1 :(得分:1)
假设输入文件中的每个条目都采用以下格式...
[{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)