我被困在项目的一个部分,我需要消除一个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.使用批量插入时,它会通知我有重复的条目作为错误消息。
也许它不起作用,因为我的方法存储了"看过"内存中的行然后继续扫描,并最终耗尽内存,因为文件太大了?
答案 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()