Vie Jul 04, 2008 5:52 pm
|
 |
lis
Perlero Nuevo

|
Registrado: 27 May 2008
Mensajes: 15
|
|
| Unir archivos |
|
|
Saludos a todos: Tengo 365 archivos .dat que quiero unirnos a todos en un nuevo archivo .dat. Hice el siguiente programa:
| Perl: | #!/usr/bin/perl
my $data= </home/lis/Desktop/DATOS/datos_met_paranal.dat/ 200*>; # es la ruta donde estan todos los archivos .dat
open (DATA, "<$data");
open (TODOS, ">todos.dat");
while ($lineas= <DATA>) {
chop($lineas);
@datos= split(" ", $lineas);
print TODOS "@datos\n";
} |
Lo único que me hace este programa es guardar el primer archivo .dat y no los 365.
Y gracias a todos los que me ayuden. |
|
|
|

Sab Jul 05, 2008 3:42 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 3915
Ubicación: Valladolid, España
|
|
|
|
|
Prueba con esto:
| Perl: | #!/usr/bin/perl
# Es la ruta donde están todos los archivos .dat
my @ficheros = </home/lis/Desktop/DATOS/datos_met_paranal.dat/ 200*>;
open (TODOSLOSFICHEROS, ">todos.dat") or die "$!\n";
foreach $fichero ( @ficheros ) {
open (FICHERO, "<$fichero") or die "$!\n";
print TODOSLOSFICHEROS <FICHERO>;
close(FICHERO );
}
close TODOSLOSFICHEROS; |
Los cambios son:
- El operador diamante (<>) cuando contiene una ruta con un comodín, se usa para obtener una lista de ficheros. Como es una lista, necesitamos guardarlos en un array. Ahí tenías el error: al guardarlo en un escalar solo almacenabas uno de esos valores
- Luego hay que abrir el fichero donde van a quedar reunidos
- Después un bucle que los recorra, uno a uno
- Para cada fichero, lo abrimos,
- Y todo su contenido es transferido al nuevo fichero. En este caso, al usar el operador diamante en un contexto de lista, nos devuelve todas las líneas del fichero, que son mandadas por print al nuevo fichero
- Cerramos el fichero y a por otro
- Al final, cerramos el nuevo fichero
Este, además, es un bonito ejemplo del doble papel que hace el operador diamante: por un lado nos sirve para obtener un listado de ficheros y por otra parte nos sirve para leer de un fichero.
Y también es un ejemplo de lo lioso de Perl: tenemos un operador que hace dos cosas completamente distintas.
Las normas de estilo más modernas, aconsejan simplificar este doble uso. Lo recomendable es dejar el operador diamante solo para leer de ficheros. Para la operación de obtener listados de ficheros es mejor usar la función glob():
| Perl: | my @ficheros = glob('/home/lis/Desktop/DATOS/datos_met_paranal.dat/200*'); |
Otro detalle: el ejemplo que te he puesto es para unir ficheros línea a línea, pero en tu caso, estás eliminando los finales de línea y sustituyéndolos por espacios en blanco. Si eso es lo que quieres hacer, puedes probar la siguiente variación:
| Perl: | #!/usr/bin/perl
# Es la ruta donde están todos los archivos .dat
my @ficheros = glob('/home/lis/Desktop/DATOS/datos_met_paranal.dat/200*');
open (TODOSLOSFICHEROS, ">todos.dat") or die "$!\n";
foreach $fichero ( @ficheros ) {
open (FICHERO, "<$fichero") or die "$!\n";
chomp(@lineas = <FICHERO>);
close(FICHERO );
print TODOSLOSFICHEROS join(' ', @lineas);
}
close TODOSLOSFICHEROS; | O esta otra:
| Perl: | #!/usr/bin/perl
# Es la ruta donde están todos los archivos .dat
my @ficheros = glob('/home/lis/Desktop/DATOS/datos_met_paranal.dat/200*');
foreach $fichero ( @ficheros ) {
open (FICHERO, "<$fichero") or die "$!\n";
chomp(@lineas = <FICHERO>);
close(FICHERO );
push (@todas_las_lineas, join(' ', @lineas) );
}
open (TODOSLOSFICHEROS, ">todos.dat") or die "$!\n";
print TODOSLOSFICHEROS @todas_las_lineas;
close TODOSLOSFICHEROS; |
|
|

Sab Jul 05, 2008 1:01 pm
|
 |
lis
Perlero Nuevo

|
Registrado: 27 May 2008
Mensajes: 15
|
|
| UNIR ARCHIVOS |
|
|
| Hola explorer: Estoy muy contenta por tus respuestas y agradecida , muchas gracias por tu ayuda porque me has ayudado a simplificar el trabajo. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|