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

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

Notapor enric73 » 2012-03-19 11:14 @510

Gracias a los dos, Birei y Explorer.

A ver, realmente el proceso es el siguiente.

Dispongo de unos ficheros de 50000 líneas y que quiero juntarlos en un solo pero todos ellos en la cabecera llevan este par de números: el 360 181. Esta cabecera no me interesa, y es más, cuando quiero juntar todos los ficheros .dat en uno de solo con el Data::Table, el fichero de salida queda alterado. Es decir, lo que me interesa es eliminar esta numeración de 360 y 181 de todos los ficheros antes de juntarlos en un solo .dat.
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 enric73 » 2012-03-19 11:25 @517

Hola de nuevo,

explorer, ¿qué se ha de modificar del script para que las columnas estén alienadas?, es decir que las unidades negativas también estén alineadas con las positivas?

Por ejemplo, ahora los símbolos negativos están debajo de las unidades positivas:
0.22
-1.77

y necesito que todas las unidades tanto positivas como negativas estén alineadas, no sé si me explico...

#!/usr/bin/perl
use Data::CTable;
use POSIX 'strftime';

my $tabla = Data::CTable->new(); # Objeto Data::CTable

my @archivos = </home/sam/enric/ASCII/UGRD*>; # listado de los archivos
#print "Uniendo ", scalar(@archivos), " archivos\n";

# Combinación
for my $i ( 1 .. @archivos ) { # hacemos un bucle por todos ellos
$tabla->combine_file( $archivos[$i-1], { # combinamos un archivo
_HeaderRow => 0, # que no tiene cabecera
_FieldList => [ $i ], # porque la prefabricamos
_CacheOnRead => 0, # y no queremos caché
});
}
# aquí ya tenemos toda la tabla, con todas las columnas, cuyos nombres son 1, 2, 3, ...

# Ponemos la fecha
my $largo = $tabla->length(); # cómo es de grande esa tabla
$tabla->row_set($largo, { # $largo también es el índice de la nueva fila
# (las filas se numeran de 0 a $largo-1)
1 => strftime('%Y%m%d%H', localtime), # en la primera columna de esa fila ponemos la fecha
});
$tabla->row_move($largo, 0); # y subimos la fila arriba del todo

# Salida
$tabla->write( # escribimos el resultado
_FileName => 'vientos.dat', # aquí
_FDelimiter => "\t", # y tabulado
_HeaderRow => 0, # pero sin las cabeceras prefabricadas
);
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-19 11:42 @529

Hola, explorer,

He utilizado tu script pero me han salido los siguientes errores de compilación:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
./eliminarfila2.pl
./eliminarfila2.pl: line 2: use: command not found
./eliminarfila2.pl: line 3: use: command not found
This is TIE, CWEB Version 2.4. (Web2C 7.5.6)
Copyright (c) 1989,1992 by THD/ITI. All rights reserved.
Usage: tie -[mc] outfile master changefile(s)
./eliminarfila2.pl: line 6: shift: @lineas: numeric argument required
./eliminarfila2.pl: line 7: untie: command not found
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


#!/usr/bin/perl
use autodie;
use Tie::File;

tie my @lineas, 'Tie::File', '/home/sam/opt/wwatch#3/v2.22/ASCII/2012031812/UGRD10m*.dat'; # enlazamos la vida de @lineas con las líneas de kk.txt
shift @lineas; # quitamos la primera línea
untie @lineas; # fin del enlace

No encuentra comandos autodie y Tie::File, ¿las he de bajar con el cpan?

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-19 12:09 @548

Los errores que sacas demuestran que has ejecutado el programa como si fuera en script del shell, no de Perl.

No puedes usar Tie::File con múltiples archivos (con el comodín '*'). Debes ir uno por uno, así que debes meter esas líneas dentro de un bucle. Igual que hemos hecho antes con el otro programa.

Tie::File sí que debe estar instalado. Si no está autodie, lo que puedes hacer es eliminar esa línea. Su función es la de matar el programa en caso de que Tie::File no sea capaz de leer el archivo.

enric73 escribiste:explorer, ¿qué se ha de modificar del script para que las columnas estén alienadas?, es decir que las unidades negativas también estén alineadas con las positivas?

Por ejemplo, ahora los símbolos negativos están debajo de las unidades positivas:
0.22
-1.77

y necesito que todas las unidades tanto positivas como negativas estén alineadas, no sé si me explico...

No hay que cambiar, pero sí introducir toda la mecánica necesaria para formatear los valores.

Lo que haría sería:
  • por cada columna de la tabla
  • con col_get() (del módulo Data::CTable) recupero la columna con todos los valores
  • Con todos los valores, averiguo la mayor longitud (length) (y suponiendo que todos los valores tienen dos decimales)
  • Ahora que sé la longitud, puedo reescribir todos los valores con la ayuda de sprintf()
  • Asigno la columna que acabo de modificar dentro de la tabla, con col_set()
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-19 13:26 @602

Buenas tardes, explorer,

Voy un poco perdido con esto que me has comentado al final del cambio de formato. He entrado en http://search.cpan.org/~ezdb/Data-Table-1.60/Table.pm pero no he encontrado nada sobre col_get()

Supongo que he de empezar con un

foreach $col
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-19 14:57 @665

No es Data::Table, sino Data::CTable.

Sí, hay que hacer un bucle por las columnas que quieres formatear. Si son todas, pues todas.
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-20 02:56 @164

Gracias, explorer.
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-20 08:24 @392

enric73 escribiste:Es decir, lo que me interesa es eliminar esta numeración de 360 y 181 de todos los ficheros antes de juntarlos en un solo .dat.
Entonces sí que no es necesario hacer dos pasos, sino que justo antes de combinarlos, quites esa primera línea.

Queda así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #use strict;
  3. #use warnings;
  4. #use diagnostics;
  5.  
  6. use Data::CTable;
  7. use POSIX 'strftime';
  8.  
  9. # Leemos los ficheros
  10. my @archivos = </home/sam/v2.22/ASCII/2012031812/UGRD10m*.dat>;
  11.  
  12. my $tabla = Data::CTable->new;                  # Tabla
  13.  
  14. for my $i ( 1 .. @archivos ) {                  # Para todos los archivos
  15.  
  16.     my $col = Data::CTable->new;                # Creamos un objeto tabla para ese archivo
  17.  
  18.     $col->read(                                 # Leemos
  19.         _FileName       => $archivos[$i-1],     # ese archivo
  20.         _HeaderRow      => 0,                   # que no tiene cabeceras de campos
  21.         _FieldList      => [ $i ],              # porque las prefabricamos
  22.         _CacheOnRead    => 0,                   # y no queremos caché
  23.     );
  24.  
  25.     $col->row_delete(0);                        # eliminamos la primera línea
  26.  
  27.     $tabla->combine( $col );                    # combinamos la columna con la tabla
  28. }
  29.  
  30. my $largo = $tabla->length();
  31. #say "Largo: [$largo]";
  32.  
  33. # Agregamos la fecha
  34. $tabla->row_set($largo, { 1 => strftime '%Y%m%d%H', localtime});
  35. $tabla->row_move($largo, 0);
  36. #print @{$tabla->fieldlist()}, "\n";
  37.  
  38. # Escribimos la tabla
  39. $tabla->write(                                  # Escribimos
  40.     _FileName   => 'vientos.dat',               # este archivo
  41.     _HeaderRow  => 0,                           # sin cabeceras de campos
  42.     _FDelimiter => "\t",                        # y columnas separadas por tabuladores
  43. );
Coloreado en 0.003 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-20 12:37 @567

Muchas gracias, explorer, me estoy peleando ahora con el formato de las columnas,



Lo que haría sería:

por cada columna de la tabla
con col_get() (del módulo Data::CTable) recupero la columna con todos los valores
Con todos los valores, averiguo la mayor longitud (length) (y suponiendo que todos los valores tienen dos decimales)
Ahora que sé la longitud, puedo reescribir todos los valores con la ayuda de sprintf()
Asigno la columna que acabo de modificar dentro de la tabla, con col_set()
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-20 12:54 @579

Si te atascas con el código o te sale error, nos enseñas el código y vemos dónde está el problema.
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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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