• Publicidad

Releer ficheros

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

Releer ficheros

Notapor galinderooo » 2009-03-03 09:50 @451

¡ Buenas !

El caso es que tengo un fichero con x líneas, cada línea contiene varios datos separados por #, y tengo otro fichero con el primer dato de las primeras líneas del primer fichero y quiero sacar el segundo dato del primer fichero; tengo este código pero solo me saca los datos del primero, los siguientes no:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(DATOSOFI, "oficina.txt") || die ("No se puede abrir el fichero oficina.txt");
open(OFICINAS, "ofis") || die ("No se puede abrir el fichero ofis");

while ($ofi = <OFICINAS>) {
        $oficina = sprintf("%05d", $ofi);

        for ($x=0; $x<=scalar($oficina); $x++) {
                foreach $datos (<DATOSOFI>) {
                        my @ofi = split("#", $datos);
                        if($ofi[2] == $oficina) {
                                print $oficina." - ".$ofi[3]."\n";
                        }
                }
        }
        print $oficina."\n";
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


He de decir que sin el for también lo he hecho, pero lo he intentado tantas veces que ya no sabía qué hacer, el caso es que solo entra al for el primer dato:

Código: Seleccionar todo
perl 1.pl
02563 - LA TORRECILLA
02563
03659
01259
00365
02156


LO SIENTO, NO ME EXPLICO NADA BIEN XD
galinderooo
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2008-09-12 04:22 @224

Publicidad

Notapor explorer » 2009-03-03 11:39 @527

El problema está en que, cuando terminas de leer el fichero <DATOSOFI>, el puntero de lectura de ese fichero queda al final. Cuando entra por segunda vez, el valor de <DATOSOFI> es falso (sigue apuntando al final del fichero). No reposicionas el puntero al principio del fichero.

Lo puedes hacer con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
seek(DATOSOFI,0,0);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
justo antes del bucle for.

Otra opción: leer el fichero DATOSOFI una vez, meterlo en un diccionario, y luego acceder directamente a él.

Algo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %ofi;
open DATOSOFI, "<oficina.txt" or die "No se puede abrir el fichero oficina.txt\n";
while (<DATOSOFI>) {
    my @ofi         = split '#';              # Partimos
    $ofi{ $ofi[2] } = $ofi[3];                # y guardamos según la clave
}
close DATOSOFI;

open OFICINAS, "<ofis" or die "No se puede abrir el fichero ofis\n";
while (my $ofi  = <OFICINAS>) {
    my $oficina = sprintf "%05d", $ofi;

    if ($ofi{$oficina}) {                     # Si existe
        print "$oficina - $ofi{$oficina}\n";  # lo presentamos
    }
    else {
        print "$oficina\n";
    }
}
close OFICINAS;
Coloreado en 0.001 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor danimera » 2009-03-03 11:48 @533

Yo pasaría todo el fichero a un array y desde el array hago las comparaciones.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open (FILE, $archivo) || die "No se pudo abrir el File";

        @file = <FILE>;
       
foreach $datos(@file){

   @ofi = split("#", $datos);
 # ahí hago lo demás

}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Notapor galinderooo » 2009-03-03 12:26 @560

Muchas gracias. Con el seek() me ha servido.

La verdad que de tantas pruebas que he hecho me ha servido para aprender bastante sobre esto :P

¡ Gracias a los 2 !
galinderooo
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2008-09-12 04:22 @224


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 14 invitados

cron