[Perl] Leer contenido de un directorio y escribirlo en pequeños archivos
Salvador Ortiz Garcia
sog en msg.com.mx
Mie Abr 30 12:41:07 CDT 2008
On Wed, 2008-04-30 at 01:19 -0500, Carmen Marcela Alegria C. wrote:
> Hola Lista,
>
> Tengo un directorio con un poco mas de 25 mil
> archivos y es un poco complicado manejarlos. Por eso
> quiero que los nombres de los archivos sean guardados
> en archivos con X cantidad de lineas para procesar
> dichas rutas despues.
>
Hola Marcela,
Una primera optimización consiste en no tener que estar abriendo
el archivo de salida para cada linea, usando el operador 'módulo':
$c=0;
$i=0;
opendir(DIR, $ARGV[0]) or die "can't open dir $ARGV[0]: $!\n";
while (defined($file = readdir(DIR))) {
if($i % 15 == 0) {
$c++;
open FH, ">./arch-$c" or die "Can't open file ./arch-$c: $!\n";
}
print FH "$file\n";
$i++;
}
closedir DIR;
print "$i lines saved in $c files\n";
Que funciona pues '$i % N == 0' es 'true' para 0 y todos los múltiplos
de N, y cada vez que abres un nuevo archivo el anterior se cierra
automáticamente.
Notas:
'if($i % 15 == 0) {' lo puedes escribir como 'unless($i % 15) {'
Si no pones paréntesis en el 'open' necesitas usar 'or' y no '||'.
Agregué "\n" en los "die" para hace menos verboso el mensaje.
A lo mejor te convendría guardar el "path" completo de cada archivo,
cambiando 'print FH "$file\n"' por 'print FH "$ARGV[0]/$file\n"'
Saludos.
Salvador Ortiz.
Más información sobre la lista de distribución Perl