• Publicidad

Imprimir con formato de columnas

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

Imprimir con formato de columnas

Notapor Juan Manu » 2014-01-26 20:48 @908

Hola, hice un script para obtener los valores de expresión a partir de datos crudos de microarrays. El código (sé que podría ser mucho mejor) es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $/='ATF'."\t".'1.0'."\n";
  2. while($lineas = <>){
  3.     chomp($lineas);
  4.     ($arriba,$abajo)=split(/"Supplier="/,$lineas);
  5.     ($letras,$numeros)=split(/"SgdIdNum"/, $abajo);#bien
  6.     @columnas=split(/Edge[\t\d\s]/,$numeros);#bien
  7.     foreach $pedazo(@columnas){
  8.         @division=split(/[\t]/,$pedazo);
  9.         print "$division[8]\t";
  10.         print "\n";}  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Lo que hago es aplicar este script a 987 archivos para de cada uno obtener el valor que quiero. El problema es que me imprime los valores que obtiene en una sola columna y lo que necesito es que la lista de valores que obtiene de cada archivo aparezcan en columnas separadas. Algo como: "valores archivo 1" \t "valores archivo 2"...\t "valores archivo 987".

Espero haber sido claro. ¡¡¡También espero que puedan ayudarme!!! De antemano, muchas gracias.
Juan Manu
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-06-12 16:48 @742

Publicidad

Re: Imprimir con formato de columnas

Notapor explorer » 2014-01-27 05:32 @272

Se puede hacer de varias formas.

En la primera, nada óptima, por cada archivo de los 987, primero abres y lees todas las líneas del archivo resultado. Luego, por cada línea del archivo a extraer sus columnas, agregas la columna a la línea del resultado, y lo imprimes en un nuevo archivo resultado.

Otra solución mejor es leer los 987 archivos, procesarlos, y guardar los elementos en una matriz (array de array). Al final, sacar la matriz en forma de columnas.

¿Qué nombres tienen esos archivos? ¿todos los archivos generan siempre una columna, o en esa columna pueden aparecer "datos vacíos"?
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

Re: Imprimir con formato de columnas

Notapor Juan Manu » 2014-01-27 08:36 @400

Hola, ¡¡muchas gracias por responder!! Todos los archivos de entrada están en formato txt y el archivo que genero al final también lo es. No existen "datos vacíos", siempre hay un valor.

De las soluciones que propones, creo que la primera es la que estoy intentando implementar (abre archivo #1, extrae los valores que necesito, e imprime en el archivo de salida "out.txt". Luego hace lo mismo para el archivo #2 y va imprimiendo en el archivo de salida "out.txt", y de ese modo hasta el último archivo). El problema es que va imprimiendo todo bajo la misma columna y lo que quiero es que imprima los valores extraídos de cada archivo de entrada en columnas diferentes dentro de mi único archivo de salida out.txt... ¡¡Vaya!! Sé que no es muy óptima esta solución, pero la verdad hace poco retomé el estudio de Perl y aún me falta mucho por aprender :(.

De la segunda solución que propones (array de array), aún no sé cómo hacerlo. Creo que es una estructura tipo hash, ¿sí?

Bueno, ¡¡de nuevo muchas gracias por tu tiempo y tu buena disposición!!

P.d.: Estuve viendo las funciones sprint e printf. ¿Crees que la solución a mi problema sea con esos comandos?
Juan Manu
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-06-12 16:48 @742

Re: Imprimir con formato de columnas

Notapor explorer » 2014-01-27 10:18 @471

Juan Manu escribiste:Hola, ¡¡muchas gracias por responder!! Todos los archivos de entrada están en formato txt y el archivo que genero al final también lo es. No existen "datos vacíos", siempre hay un valor.
Te he preguntado por los nombres de los archivos :)

Juan Manu escribiste:De las soluciones que propones, creo que la primera es la que estoy intentando implementar (abre archivo #1, extrae los valores que necesito, e imprime en el archivo de salida "out.txt". Luego hace lo mismo para el archivo #2 y va imprimiendo en el archivo de salida "out.txt", y de ese modo hasta el último archivo). El problema es que va imprimiendo todo bajo la misma columna y lo que quiero es que imprima los valores extraídos de cada archivo de entrada en columnas diferentes dentro de mi único archivo de salida out.txt... ¡¡Vaya!! Sé que no es muy óptima esta solución, pero la verdad hace poco retomé el estudio de Perl y aún me falta mucho por aprender :(.
No, no estás siguiendo el mismo guión. Repasa mis instrucciones. Si lo ves muy complicado, muéstranos el código que llevas hecho y vemos lo que pasa.

Juan Manu escribiste:De la segunda solución que propones (array de array), aún no sé cómo hacerlo. Creo que es una estructura tipo hash, ¿sí?
No. Un array de array no es hash. Más información en tu propio ordenador en perldoc perldsc, y en la Web (traducido al español). Más información en tu propio ordenador en perldoc perllol, y en la Web (traducido al español). Más información en tu propio ordenador en perldoc perldata, y en la Web (traducido al español).

Juan Manu escribiste:Estuve viendo las funciones sprint e printf. ¿Crees que la solución a mi problema sea con esos comandos?
No. Esas funciones solo formatean e imprimen. La clave de la solución (de la primera opción), es que hay que agregar una nueva columna a la información que ya existe, por lo que antes hay que leer esa información (o almacenarla en memoria, que es lo que hace la segunda opción).

Una tercera opción, incluso más cómoda, sería usar Tie::File, como hemos comentado hace poco.
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

Re: Imprimir con formato de columnas

Notapor Juan Manu » 2014-01-27 13:45 @614

¡Ja,ja,ja,ja,ja...! Como verás, soy medio lento con todo esto :?

1. El nombre de los archivos es GSM355418...19, 20... (Te envío un archivo adjunto)

2. Pues la verdad sí fue que no me quedaron muy claras tus instrucciones :oops: Mira, el código que hice es este:

$/='ATF'."\t".'1.0'."\n";
while($lineas = <>){
chomp($lineas);
($arriba,$abajo)=split(/"Supplier="/,$lineas);
($letras,$numeros)=split(/"SgdIdNum"/, $abajo);#bien
@columnas=split(/Edge[\t\d\s]/,$numeros);#bien
foreach $pedazo(@columnas){
@division=split(/[\t]/,$pedazo);
print "$division[8]\n";
}
}

Escribo en la consola: perl nombre_de_programa /ruta/de la carpeta/con los archivos/.*txt > archivoDeSalida.txt.

Al final obtengo los valores que necesito de cada archivo, pero se imprimen en una sola columna, unos bajo los otros.

Algo como:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Valores archivo #1
...
...
...
Valores archivo #2
...
....
....
Valores archivo #987
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Espero poder entenderte a la próxima... De nuevo, muchas gracias por cualquier ayuda y ¡¡¡discúlpame si ocupo tu tiempo con estas cosas tan simples!!!
Adjuntos
gsmtest.txt
(5.23 KiB) 70 veces
Juan Manu
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-06-12 16:48 @742

Re: Imprimir con formato de columnas

Notapor explorer » 2014-01-27 16:12 @716

A ver... yo ya sé por qué te falla el código, así que no es necesario que lo vuelvas a enviar. Lo que te decía es si habías entendido el guión que te he puesto.

Un poco más explicado...
Sintáxis: [ Descargar ] [ Ocultar ]
  1. * para todos los archivos 
  2. ** abrimos el archivo en lectura 
  3. ** abrimos el archivo de salida, en lectura 
  4. ** abrimos el nuevo archivo de salida, en escritura 
  5. ** por cada línea del archivo a procesar 
  6. **** leemos una línea del archivo de salida (tenemos entonces las anteriores columnas) 
  7. **** procesamos la línea del archivo a procesar, sacamos la columna, y la unimos a la leída antes (columnas anteriores) 
  8. **** imprimimos la nueva línea en el nuevo archivo de salida 
  9. ** cerramos los tres archivos abiertos antes 
  10. ** movemos (cambiamos de nombre) el nuevo archivo de salida, al anterior nombre del archivo de salida, para el siguiente archivo a procesar 
¿Ves? Necesitamos leer el archivo de salida que teníamos antes, línea a línea, para poder agregar las nuevas columnas a las que había antes.

Por eso decíamos que no era óptimo, pero sí algo claro. Mira a ver si te vale... 8)
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

Re: Imprimir con formato de columnas

Notapor Juan Manu » 2014-01-29 11:43 @530

Hola, finalmente conseguí resolverlo... ¡¡¡Muchas gracias por la ayuda!!!
Juan Manu
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-06-12 16:48 @742


Volver a Básico

¿Quién está conectado?

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