viernes, 14 de agosto de 2009

Muestra tu progreso a la hora de leer tus archivos

Perl nos permite muchas facilidades para procesar archivos y precisamente por eso lo he usado para examinarciertos logs de servidor cuando necesito saber
la causa de un problema. En una ocasión tuve que procesar varios cientos de megas de un solo archivo y dado que usaba varias expresiones regulares, tardaba un buen rato en terminar de leerlo todo.
Así que tuve la necesidad de saber cuánto llevaba procesado por el momento del archivo porque en ocasiones pensaba que se había quedado pegado el script, así que me puse la tarea de investigar como podía hacer esto y aquí dejo mi solución por si a alguien le sirve.


#!/usr/local/bin/perl

my $dir = $ARGV[0];

print "\n\n\t\tReading directory: " . $dir . " ...\n\n";
opendir(DIR, $dir);
my @files = readdir(DIR);
closedir(DIR);

foreach $file( @files){
unless ( ($file eq ".") || ($file eq "..") ) {
my $total_size_read = 0;
my $file_path = $dir . '\\' . $file;
my $filesize;
{
use strict;
use warnings;
$filesize = -s $file_path ;
$filesize = $filesize / 1000; #Kbytes
}

print "\nReading file " .$file_path . "(" . $filesize . " kb)\n";
open (CURRENT_FILE, $file_path) || die "couldn't open the file!";

while ($record = ) {

$line_number++;
if ($line_number % 100 eq 0) {
my $progress = sprintf("%.2f",(($total_size_read /1000) / $filesize) * 100);
print "\rTotal lines read: " . $line_number . " | Progress:" . $progress . "%";

}
{
use bytes;
my $byte_size = length($record);
$total_size_read = $total_size_read + $byte_size;
}
}

close(CURRENT_FILE);
}
}


  

No hay comentarios:

Publicar un comentario