• 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.

Comparar dos tablas para obtener una tercera

Notapor Pablo Yarza » 2007-09-11 11:00 @500

Hola a todos! Me estreno en este foro.

Para mi trabajo tengo dos tablas: Tabla A de 7000 registros y Tabla B de 15000. Mi tarea es localizar los 7000 registros de la A en la B (ya que los registros de la B contienen información adicional necesaria) y generar un Tabla C que sea un extracto de la B.

Como soy un ignorante de la programación en general (y de Perl también) ¡tengo dudas terribles!

Mis tablas son .txt y yo las concibo como matrices: poder llamar a cada elemento de la columna 2 de la tablaA ('i2', donde i=1-7000) y mirar si existe en la columna 2 de la tablaB; si existe, imprimir ese registro entero en una tabla C.

¿Cómo localizar los elementos de esta matrizA para usarlos?

Pablo.
Pablo Yarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-09-11 10:20 @472

Publicidad

Notapor explorer » 2007-09-11 11:19 @513

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

Habría que saber unos detalles más de como son por dentro esas tablas. ¿Tienen columnas? ¿Cuántas? ¿En posiciones fijas o separadas con un delimitador?

Luego, más preguntas como ¿Vas a buscar por una columan de A o por más columnas? ¿En B, da igual la columna en la que buscas o es solo la primera?

Una posible solución sería:
Código: Seleccionar todo
* Leer la tabla A para saber qué es lo que tenemos que buscar
* Para cada línea de la tabla B:
*   Si hay coincidencia, sacarla en la tabla C

Otra solución es igual que esta, pero cambiando A por B (cosas de las matemáticas: buscamos la intersección de dos conjuntos, por lo que es conmutativa la operación).
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 Pablo Yarza » 2007-09-11 11:29 @520

Mis tablas son de unas 10 columnas separadas por tab.
Con una sola columna de A, buscaré en unas 5 columnas de B, que son contiguas (ej: 2-6)

¡Gracias por tu atención!
Pablo Yarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-09-11 10:20 @472

Notapor explorer » 2007-09-11 12:27 @560

¡Pues adelante!

En este foro encontrarás ayuda. Prueba a escribir algo de código, propio o copiado de alguno de los miles de mensajes.

Por ejemplo, yo he encontrado estos 3 hilos que se parecen a lo que deseas:
* Trabajando con solo una región de muchas tablas
* Encontrar texto en un fichero y mover a otra carpeta
* Salida en formato matricial

usando el sistema de búsqueda.

En la página de Tutoriales (arriba del todo) hay un par de ellos que hablan de las bases de datos en formato texto, que se parece mucho (por no decir que es lo mismo) a lo que necesitas.

A medida que tengas más código, lo puedes ir publicando y te iremos ayudando en lo que podamos.
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 Pablo Yarza » 2007-09-12 05:06 @254

Hola!
he copiado las funciones del artículo tablas.txt parte I en mi código. De ellas, la sub select_by_number no me funciona.

Aquí pongo el código con el que las llamo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
&open_db("tablicula.txt");
%tabla_data = &select_by_number ('tablicula.txt','0','1');
print each(%tabla_data);
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

la tabla.txt llamada tablicula es una matriz 3x3 cuyos campos son todos texto o mezcla de número y texto.

Yo espero obtener en pantalla el contenido de la posición 'fila0columna1' y este es el error que me dice:

Código: Seleccionar todo
Argument "molecula^I1P^IDSMZ" isn't numeric in numeric eq (==) at criba.pl line 32.
Argument "pistacho^I48T^IAACC" isn't numeric in numeric eq (==) at criba.pl line 32.


¿Me podéis echar una mano? ¡Gracias!
Pablo Yarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-09-11 10:20 @472

Notapor explorer » 2007-09-12 05:50 @285

¿Has modificado la función para que el split, en lugar de partir por '|' lo haga por un tabulador?
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 Pablo Yarza » 2007-09-12 06:37 @317

he cambiado: split (/\|\|/, $registro_cero);
por: split (/\t/, $registro_cero);

me aparece un nuevo error:

Código: Seleccionar todo
Argument "molecula" isn't numeric in numeric eq (==) at criba.pl line 32.
Argument "pistacho" isn't numeric in numeric eq (==) at criba.pl line 32.
Pablo Yarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-09-11 10:20 @472

Notapor explorer » 2007-09-12 08:19 @388

Bien, la división lo hace bien, pero lo que no sabemos ahora es lo que ocurre en la línea 32 de criba.pl. ¿Puedes postearla?

Mejor si pones la parte del código (varias líneas). Yo sospecho que has copiado el ejemplo del Tutorial y no lo has adaptado a tu problema. Fíjate que en el Tutorial se utiliza el primer campo (numérico) para buscar la misma información en la otra tabla.

En tu caso, no has dicho si los campos son numéricos o alfanuméricos. Si son alfanuméricos, deberás cambiar los '==' por 'eq'.
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

Perdón por el retraso

Notapor Pablo Yarza » 2007-10-15 09:30 @437

¡Hola!

He vuelto a coger este tema después de unos días. Mi idea original ha cambiado un poco: tengo dos tablas y quiero listar en una tercera aquellos registros comunes. Cada registro tiene la información separada por tabuladores.

Os pongo el código que tengo.

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);


#extraemos el primer registro de la tablafirst y lo preparamos en la variable query;
#extraemos cada uno de los registros de la tablasecond ;
#si el registro query = registro match pues se imprime el registro match en una lista;

for ($i=0,$i<=$_[2],$i++){
        $query = shift (@regfirst);
        @querybox = split (/\t/, $query);
        for ($j=0,$j<=$_[3],$j++){
                $match = shift (@regsecond);
                @matchbox = split (/\t/, $match);
                if ($querybox eq $matchbox){
                        open (CONTACTOS, ">>contactos.txt");
                        print CONTACTOS $matchbox;
                        close (CONTACTOS);
                }
        }
}
print "done\n";
}



#metemos [0] la tabla pequeña y [1] la tabla mayor,
#[2] el numero de registros de la primera tabla (sin contar la cabecera, si la tuviera),
#[3] el numero de registros de la segunda tabla (sin contar la cabecera, si la tuviera),

&chequeo('tablaA.txt','tablaB.txt','5','10');
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El programa me dice que:
Código: Seleccionar todo
Use of uninitialized value in string eq at findbetwen.pl line 28.
Use of uninitialized value in string eq at findbetwen.pl line 28.
Use of uninitialized value in print at findbetwen.pl line 30.


Por favor, ¿podéis echarme una mano con esto?
¡Gracias!
Pablo Yarza
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2007-09-11 10:20 @472

Notapor explorer » 2007-10-15 11:33 @523

El error dice que estás usando variables no inicializadas.

En el código se ve que en el if estás comparando las variables $querybox con la $matchbox y, efectivamente, esas variables no están inicializadas en ningunda parte.
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

Siguiente

Volver a Básico

¿Quién está conectado?

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