• Publicidad

Editar ficheros .dat en un solo .dat y por columnas

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

Editar ficheros .dat en un solo .dat y por columnas

Notapor enric73 » 2012-03-16 06:59 @333

Hola compañeros, a ver si alguien me puede ayudar. Con el siguiente script, quiero adjuntar unos 40 ficheros .dat en uno de solo. Pero no quiero que se guarden en una sola fila. Necesito que los datos de cada fichero (están por columna) se guarden por columnas separadas las unas de las otras en el fichero único. Tal como tengo el siguiente script, se guardan todas las columnas en una sola columna. ¿Alguien puede ayudarme? Muchas gracias


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. # ************************************************************************** #
  3. # Script para juntar ficheros .dat en uno solo y en columnas                #
  4. # ************************************************************************** #
  5. use Class::Date qw(date now);
  6. use File::Path;
  7.  
  8.  
  9. # ----------------------------------------------------------------------------
  10. # Ruta de los archivos .dat
  11. # ----------------------------------------------------------------------------
  12. #
  13.  
  14.  
  15. # Dispongo de unos 40 ficheros que empiezan con el nombre UGRD
  16. my @fitxers = </home/enric/ASCII/2012031600/UGRD*>;
  17.  
  18. open (FICHEROS,">viento.dat") or die "$!\n";
  19.  
  20. foreach $fitxer ( @fitxers) {
  21.         open (FITXER, "<$fitxer") or die "$!\n";
  22.         print FICHEROS <FITXER>;
  23.  
  24.         close (FITXER);
  25. }
  26.  
  27. close FICHEROS;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-03-16 10:44 @489, editado 1 vez en total
Razón: Marcas de código Perl
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Publicidad

Re: Editar ficheros .dat en un solo .dat y por columnas

Notapor Birei » 2012-03-16 10:24 @475

No sé si entendí bien, ¿quieres cada archivo en una columna diferente? Si es así, prueba con ésto (adjunto ejemplo):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use warnings;
  2. use strict;
  3.  
  4. die qq[No input files\n] unless @ARGV;
  5.  
  6. my (%data);
  7.  
  8. while ( <> ) {
  9.     chomp;
  10.     push @{ $data{ $. } }, $_ || qq[];
  11. } continue {
  12.     close ARGV if eof;
  13. }
  14.  
  15. for ( sort keys %data ) {
  16.     printf qq[%s\n], join qq[\t], @{ $data{ $_ } };
  17. }
  18.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Contenido de archivos de prueba:

file1
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
xyz033E
xyz033F
xyz033G
xyz177E
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


file2
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Iub_xyz032
Iub_xyz033
Iub_xyz069
Iub_xyz070
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


file3
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
BB152
AA124
CC546
DD234
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Ejecutado así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl myscript.pl file{1,2,3}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Da el siguiente resultado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
xyz033E Iub_xyz032      BB152
xyz033F Iub_xyz033      AA124
xyz033G Iub_xyz069      CC546
xyz177E Iub_xyz070      DD234
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Birei
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-06-19 13:27 @602

Re: Editar ficheros .dat en un solo .dat y por columnas

Notapor enric73 » 2012-03-16 11:13 @509

Muchas gracias Birei,

Una consulta: me dice que no puede abrir los archivos file1, file2, file3, los tengo en otro directorio que el pl.

¿Dónde especifico la ruta? En el script que adjunté, aparece la ruta, /home/enric/ASCII/2012031600/.

Otra consulta, Birei: si tengo 40 ficheros, y no quiero especificar en el argumento los 40, si no el total, ¿cómo puedo hacerlo?

Gracias, soy bastante novato...
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Editar ficheros .dat en un solo .dat y por columnas

Notapor Birei » 2012-03-16 11:21 @514

Sintáxis: [ Descargar ] [ Ocultar ]
  1. file{1,2,3} 

es una sintaxis de Shell, para seleccionar varios ficheros sin escribir el nombre completo de todos, en tu caso haz:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl myscript.pl /home/enric/ASCII/2012031600/UGRD*
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y te pondrá el contenido ordenado. Supongo que todos tendrán el mismo número de columnas, si no habrá que ajustar un poco más la salida.
Birei
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-06-19 13:27 @602

Re: Editar ficheros .dat en un solo .dat y por columnas

Notapor enric73 » 2012-03-16 12:09 @548

¡Hola Birei! :) ¡Muchas gracias! ¡Funciona! ¡Veo que el comando push() es muy práctico! Tal como está me aparecen las columnas en el terminal. Tal como está este script, para guardar el fichero de salida con todas las columnas, ¿cómo debería ser?

Muy agradecido.

Enric
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Editar ficheros .dat en un solo .dat y por columnas

Notapor explorer » 2012-03-16 13:15 @594

Esta es mi solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Data::CTable;
  3.  
  4. my $tabla = Data::CTable->new({ _HeaderRow => 0, });
  5.  
  6. $tabla->combine_files([</home/enric/ASCII/2012031600/UGRD*>]);
  7.  
  8. $tabla->write(
  9.     _FileName   => 'vientos.dat',
  10.     _HeaderRow  => 0,
  11.     _FDelimiter => "\t",
  12. );
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

Re: Editar ficheros .dat en un solo .dat y por columnas

Notapor enric73 » 2012-03-16 14:52 @661

Gracias explorer,

¡He de instalar con el cpan el Data::CTable! No está instalado.

A ver si se instala y lo pruebo.

Muchas gracias.
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Editar ficheros .dat en un solo .dat y por columnas

Notapor enric73 » 2012-03-18 07:15 @343

Buenos días explorer.

Ya he instalado el módulo con perl -MCPAN -e 'install Date::CTable'

He ejecutado el script que me facilitó, corre sin problemas, pero solamente me guarda el último fichero .dat que hay en el directorio, solamente aparece una columna que pertenece al último fichero... No aparecen las otras columnas de datos que corresponden al resto de ficheros...

¿Qué debería modificar en el script anterior? ¿No debería introducir el comando push()?

Muchas gracias.
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Editar ficheros .dat en un solo .dat y por columnas

Notapor explorer » 2012-03-18 10:11 @465

Fíjate que en la línea 6 hay unos corchetes...

Para estar más seguros, podrías hacer:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @archivos = </home/enric/ASCII/2012031600/UGRD*>;
  2.  
  3. print "Uniendo ", scalar(@archivos), " archivos\n";
  4.  
  5. $tabla->combine_files( \@archivos );
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

Re: Editar ficheros .dat en un solo .dat y por columnas

Notapor enric73 » 2012-03-18 12:52 @577

Muchas gracias explorer,

he dejado el script de esta manera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Data::CTable;
  3.  
  4. my $tabla = Data::CTable->new( { _HeaderRow => 0, } );
  5.  
  6. my @archivos = </home/sam/enric/ASCII/UGRD*>;
  7.  
  8. print "Uniendo ", scalar(@archivos), " archivos\n";
  9.  
  10. $tabla->combine_files( \@archivos );
  11.  
  12. $tabla->write(
  13.     _FileName   => 'vientos.dat',
  14.     _HeaderRow  => 0,
  15.     _FDelimiter => "\t",
  16. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Varias cosas,

  1. De esta manera la primera línea de los diferentes ficheros planos no se conserva... ¿Tiene alguna relación con el HeadorRow?
  2. Al final del proceso, querría añadir en la fila 1 del fichero final con la fecha del año (yyyymmddhh), ¿qué comando me recomienda que al introducir esta fila no me borre el resto? Ya tengo instalado el Class::Date
  3. Otra consulta, al ejecutar el script, se genera de forma paralela un carpeta llamada cache/ con ficheros UGRD*.dat.cache, ¿para qué sirven?


¡Muchas gracias otra vez!
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Siguiente

Volver a Básico

¿Quién está conectado?

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