• Publicidad

Leer archivo de texto

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

Leer archivo de texto

Notapor kitosss » 2006-12-05 15:49 @700

Hola, buenas. Hace poco que me he iniciado en esto de Perl. Mi duda es la siguiente:
Tengo un archivo de texto en la que hay diferentes matrices una debajo de otra y todas ellas ordenadas por números. Es decir:

Código: Seleccionar todo
#Matriz1
2 3 3
2 2 2
2 2 2
#Matriz2
1 1 1
2 2 2
3 3 3

Mi pregunta es ¿cómo hacer para leer por ejemplo la matriz 5? ¿Hay alguna forma de situarse en la línea donde empieza la matriz y si es por ejemplo de 3x3 leer las 4 líneas siguientes?... Gracias

La cosa sería algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(Matrix, $archivo);
       
        while(<Matrix>)
                chomp;
                if($_= /#Matriz2/)
                {

                }
        close(Matrix);
}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
kitosss
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2006-12-05 15:39 @693

Publicidad

Notapor explorer » 2006-12-05 19:25 @851

Bienvenido a los foros de Perl en Español.

Hay varias soluciones al problema. Una de ellas es como la que comentas: ir leyendo línea a línea hasta que encontremos nuestra matriz. Luego, ir leyendo la matriz hasta que encontremos otra matriz o fin de fichero:

Sea kk.txt nuestros datos:
Código: Seleccionar todo
#Matriz1
1 1 1
2 2 2
2 2 2
#Matriz2
2 2 2
1 1 1
3 3 3
#Matriz3
3 3 3
1 1 1
2 2 2
#Matriz4
4 4 4
2 2 2
3 3 3
#Matriz5
5 5 5
2 2 2
3 3 3
#Matriz6
6 6 6
2 2 2
3 3 3

Entonces el código siguiente
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l

use Data::Dumper;

open MATRIXFILE,"<kk.txt";

LOOP:
while ( <MATRIXFILE> ) {
  chomp;
  if ( /^#Matriz5/ ) {
    # Almacenamos la matriz en un array de arrays
    while ( <MATRIXFILE> ) {
      last if /^#/;
      @fila = split;
      push @matriz, [ @fila ];
    }
    last LOOP;
  }
}
close MATRIXFILE;

print Dumper \@matriz;

print $matriz[0][2];  # Primera fila, tercera columna de la matriz
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
genera la salida:
Código: Seleccionar todo
$VAR1 = [
          [
            '5',
            '5',
            '5'
          ],
          [
            '2',
            '2',
            '2'
          ],
          [
            '3',
            '3',
            '3'
          ]
        ];
5
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 explorer » 2006-12-05 19:52 @869

Aquí hay otra forma de leerlo, suponiendo que las matrices están juntas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l

use Data::Dumper;

$/ = "\n#";            # Usamos la definición de separador de campos ($/) para decir cómo es nuestro fichero
open MATRIX,"<kk.txt";
@matrices = <MATRIX>;  # Lo leemos entero en un array. Cada elemento es una matriz
close MATRIX;

@matriztexto = split("\n", $matrices[4]);   # Nos quedamos con la matriz 5ª y la dividimos en líneas
shift @matriztexto;                         # y le quitamos la cabecera que dice "Matriz5"

foreach ( @matriztexto ) {                          # Para todas las líneas de la matriz...
  if ( $matriztexto[$i] !~ /^#/ ) {                 #     Si no hemos llegado al final...
    push @matriz, [ split(" ",$matriztexto[$i]) ] ; #         Almacenamos en @matriz la fila,
                                                    #         que será antes dividida en partes
  }
}

print Dumper \@matriz;
print $matriz[0][2];
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 explorer » 2006-12-05 20:05 @878

Esta otra forma usa 3 trucos: leer todo el fichero en una única variable escalar, usar una expresión regular para extraer la matriz 5 y un uso de map para imitar el efecto de un bucle sobre las líneas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l

undef $/;               # No hay delimitador de entrada

open MATRIX,"<kk.txt";
$matrices = <MATRIX>;   # Todo el fichero de golpe en un escalar
close MATRIX;

($matriz5) = $matrices =~ /#Matriz5.(.+?).#/s;    # Sacamos la matriz 5

@matriz = map{ [ split ] } split("\n", $matriz5); # La $matriz5 la dividimos (split) en líneas ("\n");
                                                  # por cada línea, la mapeamos (map) en un array anónimo ([])
                                                  # que contiene un array generado al dividir la línea con split

print $matriz[0][2];
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


Volver a Básico

¿Quién está conectado?

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

cron