• Publicidad

Comparar 2 ficheros y crear un 3º sin las líneas del 2º

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

Comparar 2 ficheros y crear un 3º sin las líneas del 2º

Notapor josele » 2012-09-11 20:30 @896

Buenas noches.

En primer lugar daros las gracias por existir, mis conocimientos de Perl son muy básicos pero con este foro y el copy-paste de partes de código voy haciendo mis cositas.

A lo que vamos:

Tengo dos ficheros, con varios campos cada uno, quiero comparar el primero con el segundo y generar un tercer fichero con las líneas del primero menos las líneas que contengan el mismo id ($c1) que los id ($c2) del segundo fichero.

Consigo hacer algo parecido el problema es que como hago dos bucles me repite las líneas cada vez que recorre el bucle.

Espero haberme explicado bien, aquí os dejo lo que he intentado hacer ( chapuza ).

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open( COMISI, "COMISIONES.txt" ) || die "ERROR";
  2. while (<COMISI>) {
  3.     ( $c1, $c2, $c3, $c4, $c5, $c6 ) = split /;/, $_;
  4.     chomp($c6);
  5.     open( TFILE,         ">>SALIDA.txt" )          || die "ERROR";
  6.     open( LINEASFACTURA, "COMISIONESAQUITAR.txt" ) || die "ERROR";
  7.     while (<LINEASFACTURA>) {
  8.         ( $d1, $d2, $d3, $d4, $d5, $d6 ) = split /;/, $_;
  9.         chomp($d6);
  10.         if ( $d1 ne $c1 ) {
  11.             print TFILE"$c1;$c2;$c3;$c4;$c5;$c6\n";
  12.         }
  13.     }
  14.     close(LINEASFACTURA);
  15.     close(TFILE);
  16. }
  17. close(COMISI);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Muchas gracias.

--
Josele
josele
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-09-11 20:03 @877

Publicidad

Re: Comparar 2 ficheros y crear un 3º sin las líneas del 2º

Notapor explorer » 2012-09-12 10:12 @467

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

Creo que sería así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open my $COMISI, "<COMISIONES.txt" or die "ERROR: No puedo abrir COMISI.txt: $!\n";
  2. open my $TFILE,  ">SALIDA.txt"     or die "ERROR: No puedo escribir  SALIDA.txt: $!\n";
  3.  
  4. BUCLE:
  5. while (my $linea = <$COMISI>) {
  6.     my @c = split /;/, $linea;
  7.  
  8.     open my $LINEASFACTURA, "<COMISIONESAQUITAR.txt" or die "ERROR: No puedo abrir COMISIONESAQUITAR.txt: $!\n";
  9.     while (<$LINEASFACTURA>) {
  10.         my @d = split /;/;
  11.         if ( $d[0] eq $c[0] ) {      # si encontramos una coincidencia en los primeros campos
  12.             close $LINEASFACTURA;    # cerramos: no necesitamos seguir buscando más
  13.             next BUCLE;              # y saltamos a probar con la siguiente línea
  14.         }
  15.     }
  16.     close $LINEASFACTURA;
  17.  
  18.     print $TFILE $linea;             # si no hemos encontrado ninguna coincidencia, escribimos la $linea
  19. }
  20.  
  21. close $TFILE;
  22. close $COMISI;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pero creo que esta es una solución más rápida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use autodie;
  3.  
  4. my %facturas;
  5. open my $LINEASFACTURA, "<COMISIONESAQUITAR.txt";
  6. while (<$LINEASFACTURA>) {                 # leemos la remesa de facturas
  7.     my($id) = split /;/, $_, 2;
  8.     $facturas{$id} = 1;                    # guardamos los códigos de todas las facturas
  9. }
  10. close $LINEASFACTURA;
  11.  
  12. open my $COMISI, "<COMISIONES.txt";
  13. open my $TFILE,  ">SALIDA.txt";
  14.  
  15. while (my $linea = <$COMISI>) {
  16.     my($id) = split /;/, $linea, 2;
  17.  
  18.     if ( not exists $facturas{ $id } ) {   # si no existe alguna factura que tenga ese $id,
  19.         print $TFILE $linea;               # escribimos la $linea
  20.     }
  21. }
  22.  
  23. close $TFILE;
  24. close $COMISI;
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparar 2 ficheros y crear un 3º sin las líneas del 2º

Notapor josele » 2012-12-02 15:16 @678

explorer, aún no te he agradecido la ayuda, no tengo vergüenza.

Pues eso: MUCHÍSIMAS GRACIAS, me has evitado un motón de tiempo perdido y varios dolores de cabeza.

Y aprovechando que el Pisuerga pasa por Valladolid, ciudad donde ambos residimos, me ofrezco a invitarte a unas cervezas, o si lo prefieres a un chuletón cuanto te venga bien.

Mándame un privado.
--
Josele
josele
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-09-11 20:03 @877

Re: Comparar 2 ficheros y crear un 3º sin las líneas del 2º

Notapor explorer » 2012-12-25 09:56 @455

Pues mira: estaría bien aprovechar estos días para vernos y comentar sobre Perl :)

El día 27 estoy en Madrid al mini hackaton del proyecto Perl en Español, así que quizás mejor dejarlo para la semana que viene.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparar 2 ficheros y crear un 3º sin las líneas del 2º

Notapor sufisavey80 » 2013-02-21 19:03 @836

Buenas tardes, explorer.

En ocasión anterior ya me habías apoyado, ya que me voy iniciando en Perl y agradezco tu apoyo, tengo el siguiente caso:

Tengo 2 archivos llamados "datos.csv" (tiene 21 registros) y "posicion.csv" (tiene 47 registros). Al archivo "datos.csv" quiero copiarle la columna [6] del archivo "posicion.csv" a los que son iguales en la columna [41] de ambos, generando un tercer archivo "SALIDA.txt", o ya sea en el mismo "datos.csv", quedando al final los 21 registros con la nueva información.

Intenté lo siguiente, pero igual no sea la manera:

open my $datos, "<datos.csv" or die "ERROR: No puedo abrir datos.csv: $!\n";
open my $TFILE, ">SALIDA.txt" or die "ERROR: No puedo escribir SALIDA.txt: $!\n";

BUCLE:
while (my $linea = <$datos>) {
my @c = split ',', $linea;

open my $posicion, "<posicion.csv" or die "ERROR: No puedo abrir posicion.csv: $!\n";
while (<$posicion>) {
my @d = split ',';
if ( $d[41] eq $c[41] ) {
$c[6] = $d[6];
print $TFILE $linea;
next BUCLE;
}
}
close $posicion;

}

close $TFILE;
close $datos;



Espero me expliqué bien,

¡Muchas gracias de antemano!
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803

Re: Comparar 2 ficheros y crear un 3º sin las líneas del 2º

Notapor explorer » 2013-02-21 21:36 @942

Casi lo tenías... :)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. !/usr/bin/perl
  2. use autodie;                                    # «Es mejor morir que regresar con deshonor» --proverbio Klingon
  3.  
  4. open my $datos,  '<', "datos.csv";
  5. open my $salida, '>', "SALIDA.txt";
  6.  
  7. while (my $linea = <$datos>) {                  # leemos una línea
  8.     chomp $linea;                               # quitamos carácter nueva línea, por si acaso
  9.     my @datos = split /[,]/, $linea;            # partimos en columnas
  10.  
  11.     open my $posicion, '<', "posicion.csv";
  12.     while (<$posicion>) {
  13.         chomp;
  14.         my @posicion = split /[,]/;
  15.  
  16.         if ($datos[41] eq $posicion[41]) {
  17.             $datos[6]  =  $posicion[6];
  18.         }
  19.     }
  20.     close $posicion;
  21.  
  22.     print $salida join(',', @datos), "\n";      # generamos una línea de salida a partir de los @datos modificados
  23. }
  24.  
  25. close $salida;
  26. close $datos;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pero... la solución no es nada eficiente: estás leyendo, entero, el archivo "posicion.csv", por cada registro del archivo "datos.csv".

Lo ideal es que solo lo leyeras una vez. Eso se consigue almacenando toda la información en memoria, en un array, por ejemplo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparar 2 ficheros y crear un 3º sin las líneas del 2º

Notapor sufisavey80 » 2013-02-22 12:57 @581

Buenas tardes, explorer...

Muchas gracias por tu ayuda, se logró el objetivo de generar el tercer archivo con la nueva información... ¡Eres todo un master!

Saludos cordiales.
sufisavey80
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2012-11-07 18:17 @803


Volver a Básico

¿Quién está conectado?

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