• Publicidad

Comparar dos tablas para obtener una tercera

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

Notapor Pablo Yarza » 2007-10-16 03:47 @199

Modifiqué el código anterior y ya no tenía errores, pero el programa no hacía lo que yo necesitaba. Pero finalmente he dado con la solución:


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub chequeo{

       
#abrir y preparar los archivos fuentes y el archivo de salida;
open (FIRSTDATABASE, "<$_[0]");
flock (FIRSTDATABASE,1);
@regfirst = <FIRSTDATABASE>;
close (FIRSTDATABASE);

open (SECONDDATABASE, "<$_[1]");
flock (SECONDDATABASE,1);
@regsecond = <SECONDDATABASE>;
close (SECONDDATABASE);

open (CONTACTOS, ">contactos.txt");
close (CONTACTOS);


#para cada fila ($query) de la tablafirst;
#recorremos cada fila ($match) de la tablasecond;
#si los registros query y match son iguales, se imprime el registro match en una lista;

foreach $query (@regfirst){
        foreach $match (@regsecond){
                if ($query eq $match){
                        open (CONTACTOS, ">>contactos.txt");
                        print CONTACTOS $match;
                        close (CONTACTOS);
       
                        }
                }
        }
print "done\n";
}


#metemos [0] la tabla pequeña y [1] la tabla mayor,
&chequeo ('tablaA.txt','tablaB.txt');
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Con este programa sí que puedo encontrar aquellas filas IDÉNTICAS, en ambas tablas, y tenerlas registradas en una tercera tabla.

De momento ¡ya tengo el problemilla resuelto!
¡Gracias!
Pablo.
Pablo Yarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-09-11 10:20 @472

Publicidad

Notapor explorer » 2007-10-16 04:52 @244

El open() y el close() los puedes dejar fuera de los dos bucles foreach.
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

Notapor Kiloko » 2007-10-18 15:21 @681

Saludos. Yo tengo un problema parecido: tengo 2 archivos
el primero (a) tiene datos como 10;15:20:30
el segundo (b) tiene datos como 2007-10-05-07:5:10:15

tengo que compararlos por lo cual opté por hacer esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open Data, "info.dat" or die "Error abrir datos.dat: $!\n";
while (my $linea = <Data>)
  {chomp;
        my @datos1 = split (/:/, $linea);                                                                      
  }
close Data;
open Data2, "datos.dat" or die "Error abrir info.dat: $!\n";
while (my $linea2 = <Data2>)
{chomp;
my @datos2 = split (/;/, $linea2);
}
close Data2;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


con esto abro y separo cada uno de los componentes del archivo, ya sea por ';' o ':' pero yo sé que si dentro de cada while uso
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "$datos1[1] ";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

me dará el valor de la posición n°1; mi idea era, tomar estos valores y hacer if o while, para después dependiendo de las combinaciones, lo pudiera guardar en otro archivo, pero si trato de hacer esto fuera del while, donde abro el archivo, pues simplemente no puedo. ¿Cómo hago para sacar estos valores, o que sugerencia me podrían dar?

Saludos.
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

Notapor explorer » 2007-10-18 18:20 @805

Metes los datos en un array de arrays de datos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while (my $linea = <Data>) {
    chomp;
    my @campos = split /:/, $linea;
    push @datos_primer_fichero, [ @campos ];
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo mismo para el otro.

Luego, haces un doble bucle:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $campos1 ( @datos_primer_fichero ) {
    foreach my $campos2 ( @datos_segundo_fichero ) {
        my @campos1 = @$campos1;
        my @campos2 = @$campos2;
       
        # aquí comparamos los @campos1 con los del @campos2
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero sería más interesante saber exactamente qué campos y como quieres compararlos.
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

Notapor Kiloko » 2007-10-18 18:44 @822

Casi, pero fallo algo, y creo fue mi culpa... ok la cosa esta así.

Yo tengo un archivo A el cual tiene información así
Código: Seleccionar todo
10;11;12;13;14;15;16;17;18;19;20
21;22;23;24;25;26;27;28;29;30;31
32;33;34;35;36;37;38;39;40;41;42
43;44;45;46;47;48;49;50;51;52;53

Y también tengo el archivo B el cual tiene información así
Código: Seleccionar todo
2007-08-09-12-15:10:20:30:25

:D Ahora bien, la cosa es así: se debe leer la información del archivo B en la posición digamos 4 que correspondería al numero 30 con esto no hay problema puesto que ya pude separar de la cadena completa de texto; ahora, del archivo A tomo el primer rango de números del (10 al 20) y si mi número cae entre ese rango, despliego un mensaje. Sino, pues continúo con la siguiente línea hasta que se cumpla la condición.

Mi idea de cómo hacerlo es primero separo del archivo B el campo que necesito. Ejemplo: $datos[5] que va a ser mi valor y lo guardo en un e$calar (pero aquí está lo que te comenté: no sé cómo guardarlo para después utilizarlo; pero supongamos que ya lo resuelvo, ahora bien, ya tengo mi e$calar, ahora tengo que leer el archivo A y buscar línea por línea si está en la primera línea el número... despliego (hola) si está en la segunda línea despliego (adiós) y así con las demás lineas, con diferentes mensajes. Como ves, mi proceder, ¿¿¿ voy mal, voy bien,...???
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

Notapor explorer » 2007-10-19 05:26 @268

La extracción de los datos es correcta.

La comparación puede ser muy fácil: como sólo te interesa saber si está o no en la línea, valdría con utilizar una expresión regular. Pero ojo, no vale con poner

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$linea_del_fichero_B =~ /$valor_del_campo_A/
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


porque, por ejemplo, si buscas el valor 30 y en la línea está el 300, también lo daría como válido.

Hay que poner marcadores de palabra a los lados:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$linea_del_fichero_B =~ /\b$valor_del_campo_A\b/
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

@fichero_A = qw(
    10;11;12;13;14;15;16;17;18;19;20
    21;22;23;24;25;26;27;28;29;30;31
    32;33;34;35;36;37;38;39;40;41;42
    43;44;45;46;47;48;49;50;51;52;53
);

@fichero_B = qw(
    2007-08-09-12-15:10:20:42:25
);


foreach $linea ( @fichero_B ) {

    $campo = ( split /:/, $linea )[3];

    print "Buscando $campo\n";

    foreach ( @fichero_A ) {

        print "$_ ";

        if ( m/ \b $campo \b /x ) {
            print '(Hola)';
        }
        else {
            print '(Adios)';
        }

        print "\n";
    }
}
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

Anterior

Volver a Básico

¿Quién está conectado?

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