• Publicidad

Combinar 2 archivos

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

Combinar 2 archivos

Notapor morpheus » 2008-02-08 15:52 @702

Un saludo a todos los integrantes.

Estoy introduciéndome en el mundo de Perl desde hace poco. He leído mucho de su potencial. Después de hacer varias pruebas, no he logrado generar un script que me permita combinar dos archivos. Además, no sé si Perl permitirá procesar archivos con más de 2 millones de líneas.

Tengo un archivo A con
Código: Seleccionar todo
0 1 0.09130000 -0.07460000 4.22670000 1275 1275 1275
0 2 0.09130000 -0.07460000 4.22980000 1284 1284 1284
0 3 0.09120000 -0.07470000 4.22620000 1282 1282 1282
1 1 0.09120000 -0.07470000 4.22560000 1293 1293 1293
1 2 0.09110000 -0.07480000 4.22400000 1262 1262 1262
...


y otro archivo B con
Código: Seleccionar todo
0.09130000 -0.07460000 4.22670000 0.097196
0.09130000 -0.07460000 4.22980000 0.105711
0.09120000 -0.07470000 4.22620000 0.217947
0.09120000 -0.07470000 4.22560000 0.229264
0.09110000 -0.07480000 4.22400000 0.114032
...


y necesito un archivo C, en el cual sean insertadas las dos primeras columnas del archivo A y luego todas las columnas del archivo B.
Código: Seleccionar todo
0 1 0.09130000 -0.07460000 4.22670000 0.097196
0 2 0.09130000 -0.07460000 4.22980000 0.105711
0 3 0.09120000 -0.07470000 4.22620000 0.217947
1 1 0.09120000 -0.07470000 4.22560000 0.229264
1 2 0.09110000 -0.07480000 4.22400000 0.114032
...


Además, necesito comprobar si los valores de las columnas A3, A4, A5 corresponden con las columnas B1, B2, B3.

Les agradeceré mucho sus aportes.

Felipe
morpheus
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2008-02-08 15:30 @688

Publicidad

Notapor explorer » 2008-02-08 16:36 @733

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

Perl puede procesar ficheros muy grandes. Todo depende de la cantidad de memoria disponible en tu equipo.

¿Tienes algo hecho?

Una pregunta: ¿debes hacer la unión de los ficheros y luego hacer la comprobación, o debes hacer la unión de las líneas si cumplen la condición? Es que la palabra 'Además' no indica claramente si se refiere al espacio (los ficheros) o el tiempo.
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 morpheus » 2008-02-08 17:01 @751

Gracias por la bienvenida, explorer.

Estuve realizando varios intentos, bastante básicos, pero sin resultados positivos. Sé que con más práctica lo lograré.

Debo comprobar primero, si la condición se cumple se debe hacer la unión de la línea.

Estos archivos corresponden a puntos de un módelo en 3D, los cuales están procesados en dos softwares distintos. Debido a esto, en algunas ocasiones las líneas de los valores a comprobar (coordenadas x,y,z) tienen un orden distinto en el fichero B. Pero existen en ambos ficheros.

Estoy buscando información de cómo ordenarlo.

Salu2
morpheus
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2008-02-08 15:30 @688

Notapor explorer » 2008-02-08 17:23 @766

Perl es perfecto para un problema así, pero, antes de ofrecerte una solución, queda un tema pendiente...

¿Los ficheros A y B tienen la misma longitud? ¿Qué ocurre si no se cumple la condición? ¿Qué hacemos con las líneas que no coinciden? ¿Descartamos las dos líneas de los dos ficheros o sólo descartamos la de uno solo?
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 explorer » 2008-02-08 18:10 @798

Esta es una posible solución, teniendo en cuenta el caso de que los dos ficheros tengan el mismo número de líneas.

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

open A, "<a.txt" or die;
open B, "<b.txt" or die;
open C, ">c.txt" or die;

while (
    $a = <A>    # leemos una línea del A
) {
    $b = <B>;   # y otra del B

    @A = split " ", $a;         # los campos de la línea
    @B = split " ", $b;
                                         # salida
    print C join(" ", @A[0,1], @B), "\n"
        if                               # si
            $A[2] eq $B[0] and           # se cumple
            $A[3] eq $B[1] and           # la condición
            $A[4] eq $B[2]
    ;
}

close A;
close B;
close C;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Quizás no sea muy claro para una persona que empieza. Si no entiendes algo, pregunta.
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 explorer » 2008-02-08 20:44 @905

Esta es la solución para el caso de que los dos ficheros tengan la mismas coordenadas, pero, como dices, las líneas están desordenadas.

Primero leemos el fichero A para guardar las coordenadas y luego, leyendo el fichero B, relacionamos las coordenadas y vamos generando el fichero C.

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

# leemos el fichero A y guardamos las dos primeras columnas según los valores
# del resto de columnas como claves
open A, "<a.txt" or die;
while ( <A> ) {
    @A = split;         # saca las columnas

    $coord{"@A[2,3,4]"} = "@A[0,1]";
}
close A;

# ahora leemos las líneas del fichero B y vamos creando el fichero C
open B, "<b.txt" or die;
open C, ">c.txt" or die;
while ( <B> ) {
    @B = split;         # saca las columnas

    # Pintamos las columnas 0 y 1 del fichero A referenciadas por las
    # coordenadas del fichero B, junto con la línea B recien leída
    print C $coord{"@B[0,1,2]"}, " $_";
}
close B;
close C;
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


Volver a Básico

¿Quién está conectado?

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