• Publicidad

Leer varios archivos e imprimir en columnas

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

Leer varios archivos e imprimir en columnas

Notapor ansiau » 2007-12-07 14:23 @641

Buenas.

Un saludo a todos. Conozco más o menos el lenguaje Perl, pero en estos momentos estoy 'atascado' con un problema. Tengo miles de archivos con el siguiente formato:

ATOMIC CHARGES
Código: Seleccionar todo
 ATOM   ELEMENTAL  PARTIAL    PARTIAL    PARTIAL
    NO.    SYMBOL    MULLIKEN   CM1        CM2
                     CHARGE     CHARGE     CHARGE

     1       N      0.01440     0.03208    -0.31990
     2       C     -0.16559    -0.17106    -0.02414
     3       H      0.13362     0.13398     0.11500
     4       H      0.10268     0.10307     0.08371
     5       H      0.14249     0.14289     0.12399
     6       C     -0.15736    -0.16260    -0.01658
     7       H      0.12437     0.12476     0.10576
     8       H      0.13690     0.13718     0.11840
     9       H      0.13398     0.13421     0.11539
    10       C     -0.17351    -0.17892    -0.03177
    11       H      0.13949     0.13979     0.12094
    12       H      0.10986     0.11026     0.09106
    13       H      0.14366     0.14399     0.12519
    14       C     -0.13948    -0.14370    -0.02345
    15       H      0.13956     0.14010     0.12128
    16       H      0.16987     0.17067     0.15210
    17       C      0.04240     0.06720     0.12215


De acá tengo que leerlos continuamente y extraer el valor de las cargas atómicas para cada archivo, una de las tres columnas numéricas (que representa una conformación molecular distinta). Mi problema es que estos datos tienen que ser guardados en un solo archivo y grabada en columnas. Así que para cada nuevo archivo, los datos serían agregados al mismo fichero de salida pero en una nueva columna. Algo así:

Código: Seleccionar todo
Data:

 Archivo1    Archivo2    Archivo3 ........
 data1         data2        data3
 data1         data2        data3

Y así sucesivamente.

He mirado sin éxito las funciones y opciones de print y printf, al igual de tratar de guardar los valores en arrays y luego intentar imprimir estos en el fichero de salida en formato columna. No he tenido éxito, ya que siempre imprime en líneas...

¡Si alguien tiene alguna sugerencia o truco, bienvenida es!

Muchas Gracias,

Carlos A. Ramirez-Mondragon
Pharmaceutical Sciences
University of Maryland
ansiau
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2007-12-07 14:09 @631

Publicidad

Notapor explorer » 2007-12-07 14:40 @653

Pero... falta más información...

¿Se puede grabar el fichero de salida cuando se haya terminado de leer el último fichero de entrada?

¿Siempre es la misma columna -una de las tres- la que hay que extraer, en todos los ficheros?

Si la respuesta a estas dos preguntas es sí, la solución es fácil... y si

¿la longitud de la columna numérica es igual en todos los ficheros?

también es positiva, entonces, más fácil aú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 ansiau » 2007-12-07 14:47 @657

Gracias por la pronta respuesta..

1 - Sí se puede cerrar el fichero de salida cuando se haya terminado de leer el último de entrada.

2 - Siempre se extrae la misma columna en los archivos... (en esto no tengo dificultad).

3 - La longitud de las columnas numéricas es igual en todos los ficheros de entrada.

Gracias,

Carlos A. Ramirez-Mondragon
Pharmaceutical Sciences
University of Maryland
ansiau
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2007-12-07 14:09 @631

Notapor explorer » 2007-12-07 15:31 @688

Esta es una de las muchas soluciones posibles:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    1 #!/usr/bin/perl
    2 use strict;
    3 use warnings;
    4
    5 # Aquí guardaremos la información. Será un array de arrays (matriz de dos dimensiones)
    6 # Cada fila será la columna que extraeremos de los ficheros de entrada.
    7 # El nombre del fichero lo guardaremos como primer elemento en cada fila.
    9 my @datos;
   10
   11 # Columna a extraer 0,1,2,3,4
   12 my $n_columna = 4;
   13
   14 # Número máximo de elementos almacenados, en las nuevas columnas
   15 my $altura = 0;
   16
   17 # Lectura de ficheros de entrada
   18 foreach my $fichero ( <datos*.txt> ) {
   19
   20     # Por cada fichero, lo abrimos o lo intentamos con el siguiente
   21     open FICHERO, "<$fichero"   or next;
   22
   23     # Guardamos el nombre del fichero, en un nuevo subarray
   24     push @datos, [ $fichero ];
   25
   26     # Lo leemos
   27     while ( <FICHERO> ) {
   28
   29         # Nos quedamos con las filas que nos interesan
   30         next if not /^\s+\d/;
   31
   32         # Nos quedamos con la columna que nos interesa
   33         push @{$datos[-1]}, (split " ")[$n_columna];
   34     }
   35
   36     # Actualizamos la altura máxima
   37     $altura = @{$datos[-1]} if  $altura < @{$datos[-1]};
   38
   39     # Cerramos
   40     close FICHERO;
   41 }
   42
   43 # Salida de información
   44 # Recorremos los datos, "transversalmente", ya que sabemos la altura
   45 for my $i ( 0 .. $altura-1 ) {
   46
   47     # En cada línea, pintamos los valores de los elementos i-ésimos
   48     # de todos los subarrays. Usamos un map para recorrer verticalmente
   49     # las columnas y al mismo tiempo formatear la salida
   50     print join "", map { sprintf "%14s", $datos[$_][$i] } 0 .. $#datos;
   51     print "\n";
   52 }
   53
   54 __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Una vez metida la información en una matriz bidimensional, solo hay que recorrerla de la misma forma en que se va a imprimir.
Código: Seleccionar todo
  datos001.txt  datos002.txt  datos003.txt  datos004.txt  datos005.txt
      -0.31991      -0.31992      -0.31993      -0.31994      -0.31995
      -0.02414      -0.02414      -0.02414      -0.02414      -0.02414
       0.11500       0.11500       0.11500       0.11500       0.11500
       0.08371       0.08371       0.08371       0.08371       0.08371
       0.12399       0.12399       0.12399       0.12399       0.12399
      -0.01658      -0.01658      -0.01658      -0.01658      -0.01658
       0.10576       0.10576       0.10576       0.10576       0.10576
       0.11840       0.11840       0.11840       0.11840       0.11840
       0.11539       0.11539       0.11539       0.11539       0.11539
      -0.03177      -0.03177      -0.03177      -0.03177      -0.03177
       0.12094       0.12094       0.12094       0.12094       0.12094
       0.09106       0.09106       0.09106       0.09106       0.09106
       0.12519       0.12519       0.12519       0.12519       0.12519
      -0.02345      -0.02345      -0.02345      -0.02345      -0.02345
       0.12128       0.12128       0.12128       0.12128       0.12128
       0.15210       0.15210       0.15210       0.15210       0.15210
       0.12215       0.12215       0.12215       0.12215       0.12215
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 ansiau » 2007-12-11 11:25 @517

Estimado Explorer:

Muchísimas gracias por su ayuda. ¡El script que has proporcionado ha funcionado a las maravillas y me has ayudado a ahorrar una cantidad de trabajo! Mil gracias. ¡Con gusto donaré a este sitio! Un saludo desde Baltimore, Maryland.

Carlos A. Ramirez-Mondragon
Pharmaceutical Sciences
U. of Maryland
ansiau
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2007-12-07 14:09 @631

Notapor explorer » 2007-12-11 13:37 @609

Sería interesante saber porqué necesita guardar los datos de esta manera...
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 10 invitados