python - quick string find over csv -


i'm coding little prog compare 2 csv files on python 2.7.

i use csv module , doing like:

for row in file1:
"looking if row in file1 in file2"

the prog works slow, because has check row row if string in both files. go first last row maybe 2 minutes, if search string using notepad or find tool in text edit program, finds immediately.

why occur?
there method or module implement quick search in file?

import csv import os  f1 = file('tarifa_ek_tot.csv', 'r') #general f2 = file('ek.csv', 'r') #filtro f3 = file('sort_ek_tar.csv', 'w') #archivo salida f4 = file('informe.csv', 'w') #archivo informe salida  #configuracion campo_clave = 0 #campo clave #campo_comp = 5  #campo comparar modo_prueba = true fila = true num_campos = 4 num_filas_filtro = 601 num_filas_general = 5175 ultima_posicion_encontrada = 0  #cond = 1 #copiar si ha subido cond = 2 #copiar si ha cambiado #cond = 3 #copiar si ha bajado  #codi,desc,tar,dte  #declaracion archivos general = csv.reader(f1) filtro_nostre = csv.reader(f2) archivo_salida = csv.writer(f3) salida_informe = csv.writer(f4)  #variables filtro = list(filtro_nostre) list_general = list(general) fila_filtro = 1 found = false num_comp_filtro= 0 encontrado = 0 num_coincidencias = 0 num_variaciones = 0 n = 0 num_no_encontrados = 0  #por cada fila en el archivo filtro row_filtro in filtro:     filtro_nostre = csv.reader(f2)     filtro = list(filtro_nostre)     num_comp_filtro = num_comp_filtro + 1       num_comp_general = 0       #for index,row_general in enumerate(general):     in range(n,num_filas_general):     #for row_general in range(n,num_filas_general):          os.system ("cls")         print "comparando reg general num: "+str(num_comp_general)+" n="+str(n)+" reg filtro comparar:"+str(num_filas_filtro)         print " num reg comprobados: "+str(num_comp_filtro)+" num reg coincidentes: "+str(num_coincidencias)         print "ultima posicion encontrada: "+str(ultima_posicion_encontrada)         print "comprobando registro:"+str(row_filtro[campo_clave])#+" cod_gen:"+str(list_general[campo_clave])         print "numero registros no encontrado:"+str(num_no_encontrados)               #print "comparem general:"+str(row_general[campo_clave])+" amb filtre:"+str(row_filtro[campo_clave])         #print "index: "+str(index)#+" num fila: "+str(row_general)           if list_general[n][campo_clave] == row_filtro[campo_clave]:             #print "comparem:"+str(row_general[campo_clave])+" amb:"+str(row_filtro[campo_clave])             num_coincidencias = num_coincidencias + 1                    = 0             fila_copiar = ""             while < num_campos:             #while < 1:                 print str(i)                 if == 0:                     fila_copiar = list_general[n][i]                     #print str(fila_copiar)                 else:                                    fila_copiar = fila_copiar+","+list_general[n][i]                     #print str(fila_copiar)                 = + 1               print "fila copiar: "+str(fila_copiar)             archivo_salida.writerow([fila_copiar])             encontrado = 1             ultima_posicion_encontrada = n             break   #salimos del if si lo encuentra         else:             encontrado = 0           num_comp_general = num_comp_general+1                      n = n + 1          #ultima_posicion = n#guardema la ultima posicio           if encontrado <> 1 , n == num_filas_general:         n = ultima_posicion_encontrada         num_no_encontrados = num_no_encontrados + 1         #copiamos el campo clave del registro no encontrado del filtro         codigo_no_encontrado = str(row_filtro[campo_clave])         salida_informe.writerow(codigo_no_encontrado)      print ""         print "*****************informe resultados *******************************"       print "n: "+str(n)     print "numero registros comparados filtro: "+str(num_comp_filtro)     print "numero registros coincidentes: "+str(num_coincidencias)          print "numero registros no encontrados: " +str(num_no_encontrados)     print "archivo de salida: "+str(f3.name)     print "archivo de informe: "+str(f4.name)      fila_filtro = fila_filtro + 1     fila_general = 1     #print 'fila_general:'+str(fila_general)+'  fila_filtro:'+str(fila_filtro)      #mensajes de alerta if num_coincidencias < num_comp_filtro:     print "atencion: algunas filas no se encontraron !!!!!!!!!!!!!!!!!!!!!"  f1.close() f2.close() f3.close() f4.close() 

edit:
see question not adequate.

i have been trying simple algo find string in big text file, has go line line find string, if use notepad or windows simple text editor, finds string immediately.

which kind of algo uses programs?

is because use c++ language or because use original windows dll's? or because python interpretated language?

this want know

your algo o(n^2) because iterated lines in file1 , each line iterates lines in file2 find match.

if speed search operation (in post: "looking if row in file1 in file2") o(log(n)) overall complexity o(n*log(n)).

i suggest post starting point: most efficient way lookup/search in huge list (python)

the alternative sort files before line matching. finding matches in 2 sorted files o(n). sort algo o(n*log(n)) itself, fast search save much.


Comments

Popular posts from this blog

Magento/PHP - Get phones on all members in a customer group -

php - .htaccess mod_rewrite for dynamic url which has domain names -

Website Login Issue developed in magento -