• Publicidad

Comparar archivos por fecha

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

Comparar archivos por fecha

Notapor escanda » 2008-07-18 13:58 @623

Hola, ¿qué tal?

Me dirijo a ustedes en busca de ayuda.

Tengo una aplicación con la que accedo a un directorio y me fijo los archivos .txt que hay, y me los traigo.

Lo que necesito es que me los devuelva ordenados por fecha de creación.

Espero su ayuda..
gracias.

Acá les dejo el código actual, así se entiende un poco más.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  #Abrimos el directorio
   
    my $dir = '\Desktop\Archivostxt/';

    opendir(DIR, $dir) or die $!;

    #lo abrimos.
    while (my $file = readdir(DIR)) {

       
        next unless (-f "$dir/$file");

        # buscamos solo los archivos .txt
        next unless ($file =~ m/\.txt$/);
            @propiedades = stat($file) <=> time();
            #@propiedades = time() - stat($file);
        my @archivos=$file;
                print ("@archivos");
                print("@propiedades");
    }
    closedir(DIR);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Eso me devuelve text1.txttext2.txt y lo que haya, pero necesito que me los devuelva ordenados por fecha de creación.
escanda
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-07-11 10:15 @469

Publicidad

Notapor kidd » 2008-07-18 15:08 @672

Umm, una solución rápida pero quizá no muy eficiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @archivos_ordenados = sort { -M $a <=> -M $b } readdir(DIR);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor explorer » 2008-07-18 16:15 @719

Esta es otra solución.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;

my $dir = '/home/explorer/Documents/';
my @archivos;

opendir(DIR, $dir) or die "$!\n";

while ( my $fichero = readdir(DIR) ) {

    # buscamos solo los archivos .txt
    next if $fichero !~ m/\.txt$/;

    my $archivo = $dir . $fichero;

    push @archivos, [ ((stat($archivo))[10]), $fichero ];
}

#use Data::Dumper;
#print Dumper(@archivos);

my @archivos_ordenados = sort { $a->[0] <=> $b->[0] } @archivos;

foreach my $fichero ( @archivos_ordenados ) {
    print $fichero->[1], "\n";
}

closedir(DIR);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Usamos el valor número 10 del valor devuelto por stat(), para comparar por la fecha de creación.

La solución de kidd es mucho más elegante, desde luego.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor escanda » 2008-07-21 08:12 @383

Muchas gracias por la respuesta, pero tengo un problema: me dice que hay un error al imprimir
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
("print $fichero->[1], "\n";")
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Por qué motivo puede ser?
Desde ya muchas gracias.
escanda
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-07-11 10:15 @469

Notapor explorer » 2008-07-21 08:15 @385

Creo que esa línea está mal escrita...

Seguro que el error, si no es esta línea, está en una línea anterior.

Para comprobar que el programa está bien escrito, ejecuta perl -c programa.pl.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor escanda » 2008-07-21 08:25 @392

Ahora me encargaré de eso, pero también me aparece este error:
Código: Seleccionar todo
"Argument "prueba.txt" isn't numeric in numeric comparision <<=>> at directorio"

¿Por qué puede ser eso? Si se supone que me compara las horas de creación.
escanda
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-07-11 10:15 @469

Notapor explorer » 2008-07-21 12:05 @545

No está bien creado la estructura de @archivos.

Descomenta las líneas
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Data::Dumper;
print Dumper(@archivos);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y podrás ver qué estructura tiene. Debe aparecer un array de arrays. Los arrays pequeños deben contener, en su primer elemento, la fecha de creación y el segundo, el nombre.

Si no hay dos componentes, y solo uno, entonces es que stat() no ha devuelto nada en su componente número 10. Eso depende del sistema operativo en que te encuentres. ¿Cuál es?

Prueba a cambiar 10 por 9, para ver si así te devuelve algo. Estarás cambiando la fecha de creación por la fecha de última modificación.

Prueba también a ejecutarlo antes desde la línea de comandos, y así sabes si devuelve algo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -le 'print +(stat("fichero.txt"))[10]'
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Jabarca » 2008-08-18 17:09 @756

Hola
Primero agradecer el espíritu de colaboración para con los que estamos comenzando en esto =) "Muchas Gracias"

Bueno, soy principiante en esto y me han dado una tarea muy similar al problema de escanda, nada más que solo necesito recuperar el penúltimo archivo del directorio.

He intentado direccionarlo sin el foreach, directamente, pero no he dado con la solución :( si me dan una mano se los agradeceré.

Saludos
Jabarca
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2008-08-18 16:09 @714

Notapor explorer » 2008-08-18 17:57 @790

Bienvenido a los foros de Perl en Español, Jabarca.

Si en @archivos están todos los archivos... y $archivos[-1] almacena el último archivo... entonces $archivos[-2] almacenará el penúltimo...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Jabarca » 2008-08-19 08:54 @412

Explorer, primero muchas gracias por atender mi consulta :)

Ahora mejor expongo el código que estoy usando para que se pueda entender mejor:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
use warnings;

my $dir = "\\\\X1pegasus01\\LogCustomPage\\";
my @archivos;
opendir(DIR, $dir) or die "$!\n";

while ( my $fichero = readdir(DIR) ) {
    next if $fichero !~ m/\.txt$/;
    my $archivo = $dir . $fichero;
    push @archivos, [ ((stat($archivo))[10]), $fichero ]
}

my @archivos_ordenados = sort { $a->[0] <=> $b->[0] } @archivos;
print $archivos_ordenados[-2], "\n";
closedir(DIR);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La salida de este código es: ARRAY(0x184b310)

Para ver el contenido de @archivos_ordenados
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $fichero ( @archivos_ordenados ) {
    print $fichero->[1], "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


el resultado es:

Código: Seleccionar todo
2008 08 11.txt
2008 08 12.txt
2008 08 13.txt
2008 08 14.txt
2008 08 15.txt
2008 08 16.txt
2008 08 17.txt
2008 08 18.txt
2008 08 19.txt


Donde yo necesito recuperar el archivo del día anterior “2008 08 18.txt” para pasarlo como parámetro a una función.

Otra cosa, ¿algún consejo para un buen manual en español? Aun no he podido hacerme de un libro así que me limito a manuales en la red. Nuevamente, muchas gracias.
Jabarca
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2008-08-18 16:09 @714

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron