• Publicidad

Comparar dos archivos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Comparar dos archivos

Notapor cheferas » 2014-07-17 14:01 @626

Buenas tardes, mi pregunta es la siguiente:

Tengo el archivo 1 con la siguiente estructura
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
A7YWC4  F6QV99
F1N0G5  G3N1Z8
E1BN63  F1MNS2
E1BAX5  F1N253
E1BG32  G5E586
E1B7W8  E1BG45
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Y un segundo archivo con una estructura similar
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
A7YWC4  F6QV99
F1N0G5  G3N1Z8
E1BN63  F1MNS2
E1BAX5  F1N253
E1BG32  G5E586
E1B7W8  E1BG45
F1MNS0  F1MY10
E1BE75  E1BNL4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Quiero saber cuántas veces se aparece la línea 1 del archivo 1 en el archivo 2 (contar) para esto ya realicé el siguiente script.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $arch=$ARGV[0];
  2. open (ARCH,$arch);
  3. my @array=<ARCH>;
  4. close ARCH;
  5. my $arch2=$ARGV[1];
  6. open (ARCH,$arch2);
  7. my @array2=<ARCH>;
  8. close ARCH;
  9.  
  10. foreach $i (@array){
  11.         chomp ($i);
  12.         $cont=0;
  13.         foreach $t (@array2){
  14.                 chomp ($t);
  15.                 if ($i eq $t){
  16.                         $cont++;
  17.                 }
  18.         }
  19.         print "$i\t$cont\n";
  20. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Sin embargo, debido a que el archivo 1 tiene 2.5 millones de líneas y el archivo 2 tiene 29 millones el tiempo que tarda en ejecutarse el programa es mucho.

La pregunta es si existe alguna forma de modificar el código para reducir el tiempo, o alguna otra forma de contar.

Por su atención, gracias.

Saludos
cheferas
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2014-07-17 13:51 @619

Publicidad

Re: Comparar dos archivos

Notapor explorer » 2014-07-17 16:22 @724

Bienvenido a los foros de Perl en Español, cheferas.

Este es un tema que se repite mucho en estos foros :) Por ejemplo: Comparar líneas de archivos muy grandes

Esta es una posible solución. La clave es usar un hash, en lugar de array.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3.  
  4. ## Lectura del archivo 1
  5. my $archivo1 = $ARGV[0];
  6.  
  7. my %archivo1;
  8. open (ARCH1, $archivo1);
  9. while (my $linea = <ARCH1> ) {
  10.     chomp $linea;
  11.    
  12.     $archivo1{$linea} = 0;              # contador
  13. }
  14. close ARCH1;
  15.  
  16. my $archivo2 = $ARGV[1];
  17.  
  18. ## Lectura del archivo 2
  19. open (ARCH2, $archivo2);
  20.  
  21. while (my $linea = <ARCH2>) {
  22.     chomp $linea;
  23.    
  24.     if (exists $archivo1{$linea}) {     # si la $linea del archivo 2 está en el archivo 1,
  25.         $archivo1{$linea}++;            # contamos una aparición más
  26.     }
  27. }
  28. close ARCH2;
  29.  
  30. ## Salida
  31. for my $linea (keys %archivo1) {
  32.     print "$linea\t$archivo1{$linea}\n";
  33. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Dinos cuánto tarda ahora en ejecutarse.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparar dos archivos

Notapor cheferas » 2014-07-18 10:03 @460

Hola, buen día.

Muchísimas gracias, me fue de gran utilidad su respuesta.

El script tardó aproximadamente 3 horas, pero de haberlo ejecutado con array hubiera tardado meses :oops:

Muchas gracias de nuevo por su ayuda.
Saludos. :D
cheferas
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2014-07-17 13:51 @619

Re: Comparar dos archivos

Notapor explorer » 2014-07-18 16:52 @745

¿¿¿ Tres horas ???

Me parece demasiado...

Bueno, depende de la potencia del ordenador, pero aún así me parece demasiado. ¿No estarás en Windows, verdad?

He cambiado el código, porque había un error menor.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados