Hay algunos errores de lógica. Hay algunas variables que nunca se usan o nunca han sido inicializadas.
Lo primero que he hecho es crear unos ficheros de prueba con el comando
Using bash Syntax Highlighting
perl -le 'print "Linea ", ++$numero for 1..8500' > juanito
Coloreado en 0.004 segundos, usando
GeSHi 1.0.8.4
El siguiente programa busca en el subdirectorio 'ficheros' todos esos ficheros generados antes y los divide, dejándolos en el directorio raíz, como pones en tu programa.
Using perl Syntax Highlighting
1 #!/usr/bin/perl
2
3
use warnings
;
4
use strict
;
5
6
my $s_Dir = 'ficheros';
7
8 ### Abrir Directorio
9
opendir DIR
, "$s_Dir" or die "ERR: Al leer directorio [ $s_Dir ]\n";
10
my @a_Archivos = grep { -f
"$s_Dir/$_" } readdir (DIR
);
11
close DIR
;
12
13 ### Abrir Archivo
14
foreach my $s_NombreArchivo ( @a_Archivos ) {
15
my $s_Archivo = $s_Dir . "/" . $s_NombreArchivo;
16
open IN
, "$s_Archivo" or die "ERR: Al abrir [ $s_Archivo ]\n";
17
my @a_Archivo = <IN>;
18
print "INF: Archivo [$s_Archivo] con [", scalar @a_Archivo, "] Lineas\n";
19
close IN
;
20
21 ### Comparación
22
my $s_contArchivo1 = 1;
23
while ( @a_Archivo > 3000
) {
24
my @a_arreglo3000 = splice(@a_Archivo, 0
, 3000
);
25
my $s_archivonuevo = $ENV{"HOME"}."/$s_NombreArchivo$s_contArchivo1";
26
27
print "INF: Archivo salida [$s_archivonuevo]\n";
28
open OUT
,">$s_archivonuevo";;
29
print OUT
@a_arreglo3000;
30
close OUT
;
31
$s_contArchivo1++;
32
}
33
34
if (@a_Archivo <= 3000
) {
35
my $s_archivonuevo = $ENV{"HOME"}."/$s_NombreArchivo$s_contArchivo1";
36
37
print "INF: Archivo salida [$s_archivonuevo]\n";
38
open OUT
,">$s_archivonuevo";
39
print OUT
@a_Archivo;
40
close OUT
;
41
$s_contArchivo1++;
42 }
43 }Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
* En las líneas 3 y 4 activamos unos pragmas para que nos ayuden a programar bien
* En la décima vamos leyendo todos los ficheros del directorio, pero sólo nos quedamos con aquellos que sean realmente ficheros normales (
-f)
* El bucle de la decimo cuarta y siguientes analiza todos esos ficheros. Por cada uno lo abrimos y lo leemos entero
* Luego comienza la división. Con el bucle while repetimos mientras tengamos más de tres mil líneas
* En la línea vigésimo cuarta obtenemos las primeras tres mil líneas
* Y las grabamos en la vigésimo novena
* En la trigésimo primera, incrementamos el contador sufijo del nombre de salida
* El if de las líneas trigésimo cuarta y siguientes hacen lo mismo con el resto del fichero. Realmente no es necesario este if porque sabemos que ahí el fichero siempre tiene menos de tres mil líneas
Una mejora en la lógica sería: vamos a partir un fichero mientras tengamos algo que partir:
Using perl Syntax Highlighting
1 #!/usr/bin/perl
2
3
use warnings
;
4
use strict
;
5
6
my $s_Dir = 'ficheros';
7
8 # Abrir Directorio
9
opendir DIR
, "$s_Dir" or die "ERR: Al leer directorio [ $s_Dir ]\n";
10
my @a_Archivos = grep { -f
"$s_Dir/$_" } readdir (DIR
);
11
close DIR
;
12
13 ### Abrir Archivo
14
foreach my $s_NombreArchivo ( @a_Archivos ) {
15
my $s_Archivo = $s_Dir . "/" . $s_NombreArchivo;
16
open IN
, "$s_Archivo" or die "ERR: Al abrir [ $s_Archivo ]\n";
17
my @a_Archivo = <IN>;
18
print "INF: Archivo [$s_Archivo] con [", scalar @a_Archivo, "] Lineas\n";
19
close IN
;
20
21 ### Comparación
22
my $s_contador = 1;
23
while ( @a_Archivo ) {
24
my @a_arreglo3000 = splice(@a_Archivo, 0
, 3000
);
25
my $s_salida = "$ENV{HOME}/$s_NombreArchivo$s_contador";
26
print "INF: Archivo salida [$s_salida]\n";
27
open OUT
,">$s_salida";
28
print OUT
@a_arreglo3000;
29
close OUT
;
30
$s_contador++;
31 }
32 }Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Los únicos cambios están en la parte de Comparación:
* En la línea 22 tenemos una variable contador que se encargará del sufijo
* La línea siguiente es la base de la lógica: mientras tengamos líneas qué repartir...
* ... sacamos 3000 de ellas con splice en la línea siguiente
* Las imprimimos, y listo.
Claro que... si estuvieras en Unix, este problema lo tendrías resuelto con el comando '
split':
Using bash Syntax Highlighting
split -l 3000
-a 1
-d juanito juanito
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4