• Publicidad

Dividir un archivo por líneas

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Dividir un archivo por líneas

Notapor nany » 2006-12-11 13:53 @620

Hola
Ojalá puedan ayudarme.
Tenga una lista de archivos en un directorio y ya los leí uno por uno. ¿Cómo puedo hacer para que en caso de que pase de las tres mil líneas cree el archivo con tres mil y después cree el mismo archivo añadiendo el numero dos y con las líneas restantes? ¡¡¡¡¡¡¡Ayúdenme!!!!!!!
nany
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2006-12-11 13:36 @608

Publicidad

Notapor monoswim » 2006-12-11 16:04 @711

No te entendí mucho , pero es fácil...

¿ Sabés leer un archivo línea por línea ?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(FILE,'<fff.txt');
while(my $line = <FILE>){

}
close FILE;
#PARA CONTAR LAS LÍNEAS SIMPLEMENTE $i++;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿ Sabés crear un nuevo archivo ? open(FILE,'>NEWFILE')

No creo que tengas mayores complicaciones... Hacer un condicional que evalúe el $i y ya...

Espero que te sirva

saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor explorer » 2006-12-11 18:01 @792

Supongamos que has metido todas las líneas en el array @lineas.
Si suponemos también que el fichero puede tener entre 1 y 6000 líneas, tenemos que dividir su contenido entre uno o dos ficheros.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$fichero = "salida1";
@resto = splice( @lineas, 3_000 );
print "Salida en fichero 1 $fichero\n";
# Aquí grabamos las @lineas

++$fichero;
if ( @resto ) {
    print "Salida en fichero 2 $fichero\n";
    # Aquí grabamos el @resto
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Darse cuenta de que ni siquiera comprobamos si tenemos 3000 líneas, más o menos... Perl nos ahorra MUCHO trabajo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor creating021 » 2006-12-12 14:55 @663

Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

respuestas

Notapor nany » 2006-12-18 14:34 @648

hola, mil gracias por sus respuestas; me fueron muy útiles. ¡¡¡¡saludos!!!! :)
nany
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2006-12-11 13:36 @608

Notapor nany » 2006-12-18 14:43 @655

Hola, podrían ayudarme por favor a revisar este código, ¡¡¡¡please!!!!
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
################///Abrir Directorio
    opendir DIR, "$s_Dir" or die "ERR: Al leer directorio [ " . $s_Dir ."]\n";
    my @a_Archivos = readdir (DIR);
    close DIR;
###############///Abrir Archivo
sub leeArchivoArr{

    foreach my $s_NombreArchivo (@a_Archivos){
    my $s_Archivo = $s_Dir . "/" . $s_NombreArchivo;
    open IN, "$s_Archivo"  or die "ERR: Al abrir [ $s_Archivo ]\n";
     my $i_ContLineas = 0;
    while (<IN>) {
       $i_ContLineas++;
     }
    print "INF: Archivo [$s_Archivo] con [$i_ContLineas ] Lineas\n";
    close IN;
###############///comparacion
     while (scalar @a_Archivo >3000){

         my @a_arreglo3000 = splice @a_Archivo,3000;
         my $s_archivonuevo = "$home" + "$s_archivonuevo" + "$i_Contarchivo";

          open OUT ,">$s_archivonuevo";
          print OUT "$s_arreglo3000\n";
          close OUT;
          my $s_contArchivo = 0;
          $s_contArchivo ++;
          }

     if ($a_Archivo < 3000){
        my $s_archivonuevo = "$home" + "$s_archivonuevo" + "$i_Contarchivo";

          open OUT ,">$s_archivonuevo";
          print OUT "$a_Archivo";
           close OUT;
           }
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
nany
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2006-12-11 13:36 @608

Notapor creating021 » 2006-12-18 17:18 @762

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/env perl
use strict;
use Cwd;

my $s_Dir = getcwd();
opendir DIR, "$s_Dir" or die "ERR: Al leer directorio [ " . $s_Dir ."]\n";
my @a_Archivos = readdir (DIR);
closedir DIR;

sub leerArchivoArr {
  foreach my $file (@a_Archivos){
    if(-f $file){ # si es un fichero...
      open IN, $file or die "Error: $_ $!\n";
      my $linea = 0;
      while(<IN>){
          $linea++;
      }
      close IN;
      print "INF: Archivo [$s_Dir/$file] con [$linea] Lineas\n";
    }
  }
}
leerArchivoArr();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo otro no se para que así que...
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2006-12-18 18:08 @797

Hay varios errores:
* La variable $s_arreglo3000 no está inicializada en ningún sitio. Supongo que te refieres a la @a_arreglo3000.

* La línea de 'my $s_contArchivo = 0;' debería estar antes del while. De otra forma, ese contador siempre valdrá uno dentro del bucle e indefinido fuera de él.

* La variable $a_Archivo no está inicializada en ningún sitio. Supongo que te refieres a la @a_Archivo.

* ¿Qué ocurre si el número de líneas es exactamente múltiplo de 3000? Pues que el último if también se ejecuta y se crea un archivo nuevo de tamaño 0.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Este...

Notapor creating021 » 2006-12-18 18:39 @819

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $s_archivonuevo = "$home" + "$s_archivonuevo" + "$i_Contarchivo";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


[listyk][*yk]Se declara dos veces[/*:myk]
[*yk]$home y $s_archivonuevo no son números ($Home no ha sido declarado y $_archivonuevo no se puede definir a si mismo).
Intenta concatenar con coma (",") o punto (".") como esto:
my$resultado = $variableuno, $variabledos;[/*:myk][/list:uyk]
:roll:

La función leeArchivoArr núnca es llamada así que $s_Archivo queda indefinido si alguna vez fue definido.

Lo mejor, scalar es más rápido que $#array + 1y dos segúndos más rapido que $scalar = @array; 8) yo no lo sabía.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2006-12-18 18:45 @823

La coma no sirve para concatenar strings.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Intermedio

¿Quién está conectado?

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