逐行删除文本文件中的重复项

Posted

技术标签:

【中文标题】逐行删除文本文件中的重复项【英文标题】:Remove duplicates in text file line by line 【发布时间】:2017-03-08 23:36:10 【问题描述】:

我正在尝试编写一个 Python 脚本来删除文本文件中的重复字符串。但是,重复数据删除应该只发生在每一行内。

例如,文本文件可能包含:

þ;ABC.001.123.1234;þ;;þ;10 ABC\ABCD\ABCDE;10 ABC\ABCD\ABCDE;þ þ;ABC.001.123.1234;þ;;þ;10 ABC\ABCD\ABCDE;12 EFG\EFG;12 EFG\EFG;þ þ;ABC.001.123.1234;þ;;þ;10 ABC\ABCD\ABCDE;12 EFG\EFG;09 XYZ\XYZ\XYZ;12 EFG\EFG

因此,在上面的示例中,脚本应该只删除粗体字符串。

我搜索了 Stack Overflow 和其他地方以尝试找到解决方案,但运气不佳。似乎有许多解决方案可以删除重复的行,但我正在尝试逐行删除一行中的重复项。

更新:澄清一下 - þ 是每个字段的分隔符,; 是每个字段中每个项目的分隔符。在每一行中,我试图删除分号之间包含的任何重复字符串。

更新 2: 示例已编辑以反映重复值可能并不总是紧跟在值的第一个实例之后。

【问题讨论】:

使用带有反向引用的正则表达式来检测一个字符串,后跟一个自身的副本。 您的字段是否用分号分隔; ?因为 ABC 和 123 重复了很多次。 如果字段用分号隔开,那么þ字符应该如何处理呢?是否可以在行中任何地方出现重复,或者您只对连续重复感兴趣?另外:匹配是否区分大小写,空格是否重要? @ekhumoro þ 分隔每个字段,; 分隔字段下的每个项目。因此,基本上,逐行删除分号之间的重复字符串。 你仍然需要回答空格是否重要:10 ABC\ABCD\ABCDE; 10 ABC\ABCD\ABCDE 不是重复的,因为空格使它们不同。 【参考方案1】:

@Prune 的回答给出了这个想法,但需要像这样修改:

input_file = """"þ;ABC.001.123.1234;þ;;þ;10 ABC\ABCD\ABCDE;10 ABC\ABCD\ABCDE;þ
þ;ABC.001.123.1234;þ;;þ;10 ABC\ABCD\ABCDE;12 EFG\EFG;12 EFG\EFG;þ"""""

input = input_file.split("\n")

for line in input:
    seen_item = []
    for item in line.split(";"):
        if item not in seen_item or item == "þ":
             seen_item.append(item)
    print(";".join(seen_item))

【讨论】:

【参考方案2】:
import re
with open('file', 'r') as f:
     file = f.readlines()
for line in file:
     print(re.sub(r'([^;]+;)(\1)', r'\1', line))

逐行读取文件;然后使用 re.sub 替换重复项。

【讨论】:

谢谢。这真是一个很棒的解决方案。我现在唯一的问题是删除重复值的第一个实例后不一定立即出现的重复项。例如:;þ;MEP.0002.087836;þ;;þ;15 Engineering\03 Personal Folders\ENGBIBLES\Cranes\Liebherr\LT1220;15 Engineering\03 Personal Folders\ENGBIBLES\Cranes\Liebherr\LG1300;15 Engineering\03 Personal Folders\ENGBIBLES\Cranes\Liebherr\LT1220;15 Engineering\03 Personal Folders\ENGBIBLES\Cranes\Liebherr\LG1300;

以上是关于逐行删除文本文件中的重复项的主要内容,如果未能解决你的问题,请参考以下文章

linux bash按'yymmdd'而不是'ddmmyy'列格式对文本文件进行排序,然后按时间排序,然后删除重复项

如何将文件逐行读入node.js中的数组[重复]

从文本文件中逐行提取数据并将其存储在python的列表中[重复]

text 逐行读取文本文件并重复处理直到最后一行的示例。 #SenseTalk

text 逐行读取文本文件并重复处理直到最后一行的示例。 #SenseTalk

逐行处理非常大 (>20GB) 的文本文件