使用Python&正则表达式,找到重复的行

时间:2016-03-09 20:39:35

标签: python regex

我被困在项目的一个部分,我需要消除一个1.62亿行长的文件中的重复行。我已经实现了以下脚本(但它没有删除所有重复的行):

lines_seen = set() # holds lines already seen
outfile = open('C:\\Users\\Lucas\\Documents\\Python\\Pagelinks\\pagelinkSample_10K_cleaned11.txt', "w")
for line in open('C:\\Users\\Lucas\\Documents\\Python\\Pagelinks\\pagelinkSample_10K_cleaned10.txt', "r"):
    if line not in lines_seen: # not a duplicate
        outfile.write(line)
        lines_seen.add(line)
outfile.close()

我需要编写一个正则表达式来消除任何重复的行!任何帮助将不胜感激,谢谢!

编辑:我将1.62亿行插入MS SQL 2014.使用批量插入时,它会通知我有重复的条目作为错误消息。

也许它不起作用,因为我的方法存储了"看过"内存中的行然后继续扫描,并最终耗尽内存,因为文件太大了?

2 个答案:

答案 0 :(得分:1)

如果您的文件包含162M行,则可能不需要Python。

您好像在Windows上运行。如果你有Linux / OSX / * BSD,或者安装了Cygwin,你可以这样做:

cat the_huge_file | sort --unique > file_without_duplicates

在Windows上,有一个sort shell实用程序,所以

sort <the_huge_file >sorted_file 

应该有效,希望以记忆效率的方式。也许它还有一个删除重复的开关;咨询sort /?

如果没有,在排序后删除重复的行是件小事:逐行读取文件(不是一次读取整个文件),如果它与前一行不同,则只使用一行。一个简单的Python程序可以做到。

答案 1 :(得分:0)

这是使用python和sqlite的内存高效解决方案。此脚本将从文本文件中逐行读取,并插入具有唯一索引的sqlite。如果它检测到重复,它将打印行#和行复制内容。

最后,您将清除sqlite数据库中的数据。您可以轻松地将数据从sqlite导出到cvs,甚至直接导入SqlServer。

import sqlite3

conn = sqlite3.connect('data.db')
with conn:
    file_name = 'C:\\Users\\Lucas\\Documents\\Python\\Pagelinks\\pagelinkSample_10K_cleaned10.txt'

    sql_create = "CREATE TABLE IF NOT EXISTS data(line TEXT UNIQUE)"
    sql_insert = "INSERT INTO data VALUES (?)"

    conn.execute(sql_create)
    conn.commit()

    index = 1

    with open(file_name, "r") as fp:
        for line in fp:
            p = line.strip()
            try:
                conn.execute(sql_insert, (p,))
            except sqlite3.IntegrityError:
                print('D: ' + str(index) + ':  ' + p)
            finally:
                index += 1
        conn.commit()