• Publicidad

Comparación de archivos

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

Comparación de archivos

Notapor dbustos » 2012-03-29 08:23 @390

Hola .

He estado utilizando un script para comparar archivos y que me genere uno nuevo solo con los datos que necesito por algún tiempo. Sin embargo, algo pasó que ahora me funciona bien cuando el segundo archivo tiene 3 campos, pero no cuando tiene más de 3 campos. ¿Qué puede estar pasando?

Muchas gracias y saludos a todos

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. ### Cabecera
  6. open my $OUTPUT, '>>', 'zeta_clubsI.out';
  7.  
  8. ### Leer el primer archivo
  9. open my $ARQ, '<', "kkk.out" or die "can not open the file $ARGV[0]";
  10. my @arq = <$ARQ>;
  11.  
  12. close $ARQ;
  13.  
  14. ### Leer el segundo archivo
  15. open my $LIST, '<', "kkkk.csv" or die "can not open the file $ARGV[1]";
  16. my @list = <$LIST>;
  17. close $LIST;
  18.  
  19. ### Comparación
  20. for my  $lastline(@arq) {                       # para todas las líneas del primer archivo
  21.        
  22.  
  23.     for my $thisline (@list) {                  # para todas las líneas del segundo archivo
  24.  
  25.             my ($club, $sym, $ens1, $D1) = split /,/, $thisline;
  26.             my ($NP2, $ensemb2) = split /,/, $lastline;
  27.                
  28.             if ($ens1 eq $ensemb2
  29.                 ){
  30.                 print $OUTPUT join("\,", $NP2, $club, $D1, "\n");
  31.             }
  32.         }
  33. }
  34.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-03-29 09:38 @443, editado 2 veces en total
Razón: Marcas de código Perl
dbustos
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-12-21 10:07 @463

Publicidad

Re: Comparación de archivos

Notapor explorer » 2012-03-29 10:12 @466

Yo veo correcta la extracción de datos, con el split(), salvo que no eliminas antes el carácter o caracteres de fin de línea de $thisline, por lo que podría afectar a la salida posterior.

Es mejor que pongas un chomp($thisline) antes del split(), para que quite esos caracteres.

Por otra parte, este método de comparación es muy ineficiente, debido a que estás comparando todas las líneas del segundo archivo con todas del primero. Mejor dicho, no las líneas, sino solo unos campos. El número de comparaciones puede ser muy grande.

Si, por ejemplo, supiéramos que los campos $ens1 del segundo archivo no se repiten (solo aparecen una vez en todo el segundo archivo), entonces es mucho mejor, en el proceso de lectura de ese archivo, guardarlo como un hash, y así, solo necesitas realizar un bucle:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. ### Leer el segundo archivo
  7. my %ens;
  8. open my $LIST, '<', "kkkk.csv";
  9. while (<$LIST>) {
  10.     chomp;                                      # quitamos retorno de carro
  11.     my ($club, undef, $ens, $D1) = split /,/;
  12.  
  13.     $ens{$ens} = [ $club, $D1 ];                # almacenamos información
  14. }
  15. close   $LIST;
  16.  
  17. ### Leer el primer archivo
  18. ### mientras sacamos el resultado
  19. open my $OUTPUT, '>>', 'zeta_clubsI.out';
  20. open my $ARQ,    '<',  'kkk.out';
  21.  
  22. while (<$ARQ>) {
  23.     chomp;                                      # quitamos retorno de carro
  24.     my ($NP2, $ensemb2) = split /,/;
  25.  
  26.     if ($ens{$ensemb2}) {                       # si $ensemb2 existe como clave en %ens,
  27.                                                 # hacemos la salida de datos
  28.         print $OUTPUT join(',', $NP2, @{ $ens{$ensemb2} } ), "\n";
  29.     }
  30. }
  31.  
  32. close $ARQ;
  33. close $OUTPUT;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparación de archivos

Notapor dbustos » 2012-03-29 12:08 @547

Sí, efectivamente, ¡¡agregando el chomp() funciona!!
¡Mil Gracias!
dbustos
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-12-21 10:07 @463


Volver a Básico

¿Quién está conectado?

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