• Publicidad

Unir archivos

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

Unir archivos

Notapor lis » 2008-07-04 18:52 @827

Saludos a todos: Tengo 365 archivos .dat que quiero unirnos a todos en un nuevo archivo .dat. Hice el siguiente programa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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";
}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Lo único que me hace este programa es guardar el primer archivo .dat y no los 365. :cry:

Y gracias a todos los que me ayuden.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Publicidad

Notapor explorer » 2008-07-05 04:42 @237

Prueba con esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @ficheros = glob('/home/lis/Desktop/DATOS/datos_met_paranal.dat/200*');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
O esta otra:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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;
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

UNIR ARCHIVOS

Notapor lis » 2008-07-05 14:01 @626

Hola explorer: Estoy muy contenta por tus respuestas y agradecida , muchas gracias por tu ayuda porque me has ayudado a simplificar el trabajo.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Notapor Kiloko » 2008-09-05 12:22 @556

Saludos perleros, tengo un problema parecido y un programa que podría complementar la información de explorer.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use POSIX;
#**************************************************
my $AYER = strftime("%Y%m%d", localtime(time - 86400));
#**************************************************
$AYER1= "cero_$AYER.txt";
$AYER2= "uno_$AYER.txt";
$AYER3= "dos_$AYER.txt";

foreach ($AYER1,$AYER2,$AYER3) {
    open(FILE, $_) || ((warn "No puedo crear el archivo $_\n"));
    while (<FILE>) {
        open (Data, ">>SAT_$AYER.dat");
        print Data "$_";
    }
    close(FILE);          
}
{
    open (Data2, ">>SAT_$AYER.dat");
    print Data2 "commit;\n";
    print Data2 "exit\n";
    close(Data2);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El programa une tres archivos en uno solo y al final abre el archivo resultante e inserta el final commit y exit, para meterlo directo en la bd, pero de una fecha acá, está haciendo algo extraño, y es que algunas veces, inserta primero el commit y el exit, al inicio del archivo, y necesito que sea al final. ¿Cómo ven? ¿Dónde podría estar fallando...?

SAludos.
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

Notapor explorer » 2008-09-05 14:48 @658

Creo que el error está en que no se cierra el fichero asociado a Data.

Esta es una variación más cómoda, EMHO, (no probada):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use POSIX;
use warnings;

my $AYER = strftime "%Y%m%d", localtime(time - 86_400);

my $FICHERO_AYER1 = "cero_$AYER.txt";
my $FICHERO_AYER2 = "uno_$AYER.txt";
my $FICHERO_AYER3 = "dos_$AYER.txt";

open SALIDA, ">>SAT_$AYER.dat" or die "No puedo agregar al fichero de salida: $!\n";

for my $fichero ($FICHERO_AYER1, $FICHERO_AYER2, $FICHERO_AYER3) {
    open FICHERO, "<$fichero"
        or warn "No puedo abrir el archivo $fichero: $!\n"
        and next;
    while (<FICHERO>) {
        print SALIDA $_;
    }
    close FICHERO;
}

print SALIDA "commit;\nexit\n";

close SALIDA;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La principal diferencia es el reducir las operaciones de apertura y cierre del fichero de SALIDA.
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

Notapor Kiloko » 2008-09-05 15:33 @690

mmm creo que con esto HEMOS de cerrar este tema, jjajajajaja, sí, ya sé... pero tenía que decirlo...

* mmmm, mira que no me había dado cuenta en eso, yo lo cerraba pero era FILE...
* my $AYER = strftime "%Y%m%d", localtime(time - 86_400); Eso es nuevo... :P

Ok, dejarme revisarlo :-) Mil gracias, Explorer...
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL


Volver a Básico

¿Quién está conectado?

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