2016-03-15

Chequear coincidencias en las lineas de dos archivos de texto

Tenía el siguiente problema:

Dos archivos de texto cada uno con entre 7 y 9 millones de registros de datos y no sabía si parte de los registros de A estaban en B. Quería saber los registros que estaban en A y no estaban en B para sumarlos a B.

Comprobarlo en mysql me resultaba imposible por lo que tardaba.

Probé desde la consola de linux:

grep -Fvf archivo1.txt archivo2.txt>/home/usuario/noestan.txt 

y se quedaba sin memoria.

Probé este archivo de linux haciendo que el archivo1 tuviera sólo 1000 líneas y así pronosticar cuanto tardaría con los 7 millones de líneas:


file1=open("C:\\Users\\carlos\\Documents\\de\\archivo1.txt","r")
file2=open("C:\\Users\\carlos\\Documents\\de\\archivo2.txt","r")
file3=open("C:\\Users\\carlos\\Documents\\de\\noestan.txt","w")
lines1=file1.readlines()
lines2=file2.readlines()
encontrado=0
for line1 in lines1:
for line2 in lines2:
if line1==line2:
encontrado2=1
if encontrado2==0:
print(line1)
file3.write(line1)
encontrado2=0
# Cerrar archivos abiertos
file1.close()
file2.close()
file3.close()
El resultado fue que tardaría más de 400 días...

Así que probé con sets:

import time
start = time.time()
file1=open("C:\\Users\\carlos\\Documents\\de\\archivo1.txt","r")
file2=open("C:\\Users\\carlos\\Documents\\de\\archivo2.txt","r")
file3=open("C:\\Users\\carlos\\Documents\\de\\noestan.txt","w")
data2   = set(file2.read().splitlines())
data1   = set(file1.read().splitlines())
for list in data1:
if list not in data2:
file3.write(list)
file3.write('\n')
# Close opend file
file1.close()
file2.close()
file3.close()
end = time.time()
print(end - start)


Y el resultado fue que tardó 12 segundos. Lo peor fue que todos los registros de A estaban en B por lo que me servirá para otra vez pero no para esta. Metí algún resultado falso en A para ver que realmente funcionaba y si.