• Publicidad

Comparación de dos arrays y eliminar lo común

¿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 dos arrays y eliminar lo común

Notapor Pepito_el_programer » 2016-10-25 10:49 @492

Buenas de nuevo.

Tengo un problemilla y no sé cómo continuar, o más bien, qué es lo que estoy haciendo mal.

Tengo dos ficheros, uno contiene información de personas, como 'dni', 'nombre', etc., en un fichero plano separado por ",". Lo vamos a llamar 'fichero.txt' y el otro solo contiene el DNI. Lo llamamos Dni.txt.

En el primer fichero existen 50 registros y en el segundo fichero 10 registros cuyos DNI aparecen en el fichero primero.
Tengo que quedarme con un fichero que contenga los 40 restantes, es decir, los DNI que no aparezcan en el segundo fichero.

Habrá mil maneras y seguramente más eficaces que la mía. Mi camino ha sido meter los datos de esos fichero en dos arrays, recorrerlos y comparar. Si existe, no hago nada y si no existen, los guardo en un tercer array que será mi fichero final.

He intentando por medio de arrays, crear una hash de DNI para comparar y no me funciona nada. Si me podéis ayudar, dar unas pautas, indicarme qué es lo que falló. Lo agradezco.

Este es mi código.

Un saludo y muchas gracias.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my $file  = 'fichero.txt';
  6. my $file2 = 'Dni.txt';
  7. my %dni;
  8. my @dnis;
  9. my @fichero;
  10. my @campo;
  11. open( my $data2, '<', $file2 ) or die;
  12.  
  13. while ( my $nu = <$data2> ) {
  14.     $dni{$nu} = 1;
  15.     @dnis = sort keys %dni;
  16. }
  17.  
  18. open( my $data, '<', $file ) or die;
  19. while ( my $line = <$data> ) {
  20.     push( @fichero, $line );
  21. }
  22.  
  23. for my $fi (@fichero) {
  24.     @campo = split ",", $fi;
  25.     if ( exists $dni{ $campo[0] } ) {
  26.         print "existe\n";
  27.     }
  28.     else {
  29.         print "no existe\n";
  30.     }
  31. }
  32.  
  33. exit 0;
  34.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Pepito_el_programer
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2016-10-06 13:56 @622

Publicidad

Re: Comparación de dos arrays y eliminar lo común

Notapor netsoul » 2016-10-25 13:11 @591

No sé si está correcto pero el código lo he sacado y modificado de una publicación anterior de explorer.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3.  
  4. my %dni;
  5.  
  6. open(DNI, '<Dni.txt') or die "$!\n";
  7. while ( my $linea = <DNI> ) {
  8.     my ($columna) = split(" ", $linea);
  9.  
  10.     $dni{$columna} = $linea;
  11. }
  12. close(DNI);
  13.  
  14. open(FICHERO, '<fichero.txt') or die "$!\n";
  15. open(SALIDA, '>salida.txt') or die "$!\n";
  16.  
  17. while ( my $linea = <FICHERO> )
  18. {
  19.         my ($columna) = split(",", $linea);
  20.         if (!$dni{$columna} )
  21.         {
  22.                 print SALIDA $columna;
  23.         }
  24. }
  25.  
  26. close(FICHERO);
  27. close(SALIDA);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

No sé si funcionará con lo que pides, de igual forma, ya me estoy volviendo viejo.
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Re: Comparación de dos arrays y eliminar lo común

Notapor explorer » 2016-10-25 17:35 @774

En efecto, la solución es meter todos los DNI en un hash, como claves (los valores, dan igual, siempre que no sean '0', 0, undef, o la cadena vacía).

Luego, abrimos el fichero principal y lo recorremos por filas. Por cada fila, sacamos el campo del DNI, y miramos a ver si existe en el hash o no. Con un if() vale para saberlo.
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


Volver a Básico

¿Quién está conectado?

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