Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Unir archivos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Vie Jul 04, 2008 5:52 pm
lis
Perlero Nuevo
Perlero Nuevo
Registrado: 27 May 2008
Mensajes: 15
Unir archivos Responder citando

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. Crying or Very sad

Y gracias a todos los que me ayuden.
Mensaje Sab Jul 05, 2008 3:42 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3915
Ubicación: Valladolid, España
Responder citando

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;
Mensaje Sab Jul 05, 2008 1:01 pm
lis
Perlero Nuevo
Perlero Nuevo
Registrado: 27 May 2008
Mensajes: 15
UNIR ARCHIVOS Responder citando

Hola explorer: Estoy muy contenta por tus respuestas y agradecida , muchas gracias por tu ayuda porque me has ayudado a simplificar el trabajo.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group