• Publicidad

Extraer matriz de archivo

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

Extraer matriz de archivo

Notapor logaritmos » 2016-09-05 21:42 @946

Estimados, estoy iniciándome en Perl y me alegra mucho estar en este foro.

Bueno, tengo un archivo largo pero que he cortado para efectos prácticos, donde necesito extraer una matriz de NO2. He buscado en el foro algo que me ayudara y di con algo pero al momento de ejecutarlo no hace nada.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  
  2. #!/usr/bin/perl
  3. # use diagnostics;
  4. # use warnings;
  5.  
  6. while(my $file=<*.lst>){
  7.  
  8. $d='\**';
  9.  
  10. system ("perl -nE 'print if /  SPECIES: NO2             LAYER:   1       year: 15  month:  1  day:  1  Julian day:   1  hour:  1 / .. /^[     -]+/ and /^    /' $file > output.txt");
  11. }
  12.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

En el archivo original (cierre.lst) en la parte que me interesa, tiene entremedio signos '+' y letras 'I' que he borrado suponiendo que eso me haría más fácil obtener lo que quiero, pero no. Así que les agradecería muchísimo a corregir mi error.
logaritmos
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2016-09-05 19:47 @866

Publicidad

Re: Extraer matriz de archivo

Notapor explorer » 2016-09-06 03:28 @186

Bienvenido a los foros de Perl en Español, logaritmos.

Por favor, reedita tu mensaje y envía el archivo original, tal cual estaba, sin modificaciones.

Es preferible trabajar con el archivo en su forma original, para que Perl nos ayude en todos los pasos que necesitamos hacer.
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

Re: Extraer matriz de archivo

Notapor logaritmos » 2016-09-06 07:11 @341

Muchas gracias por responder. Adjunto el archivo original (está cortado pero lo hice por que pesaba mucho).
Adjuntos
cierre.lst.tar.gz
(26.43 KiB) 116 veces
logaritmos
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2016-09-05 19:47 @866

Re: Extraer matriz de archivo

Notapor explorer » 2016-09-06 16:41 @736

Esta es una forma de leerlo, cercana a tu código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use autodie;
  3.  
  4. open my $SALIDA, '>', 'output.txt';             # abrimos el resultado
  5.  
  6. for my $archivo (<*.lst>) {                     # para todos los archivos
  7.     open my $LST, '<', $archivo;                # lo abrimos
  8.     while (<$LST>) {                            # para cada línea del archivo
  9.  
  10.         # si la línea está entre la cabecera y el final de la tabla
  11.         if (my $res = /SPECIES: NO2\s+LAYER/ .. /^\s+1\s+2/) {
  12.            
  13.             print $SALIDA $_;                           # sacamos la línea
  14.  
  15.             print $SALIDA "\n" if $res =~ /E0$/;        # caso de última fila, para separar de la siguiente matriz
  16.         }
  17.     }
  18.     close $LST;
  19. }
  20.  
  21. close $SALIDA;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Otra cosa es que quieras obtener la matriz para hacer algo con ella. Quiero decir... ¿es realmente necesario guardar las matrices a disco si las vamos a procesar con otro programa Perl? Casi mejor si lo hacemos todo con el mismo.

Dinos qué quieres hacer con ellas. A lo mejor se puede hacer con Perl ;)
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

Re: Extraer matriz de archivo

Notapor logaritmos » 2016-09-06 21:15 @927

Hola, explorer. ¡Guau, gracias!

Y sí, tengo que hacer otras operaciones. El archivo tiene datos de matrices de 20x20 de NO, NO2 y O3 en formato horario. Mi idea es extraer la matriz horaria de NO2, almacenarla y con octave obtener el promedio anual del punto, por ejemplo, 11,7 (son varios puntos).

Tal vez es muy largo mi procedimiento, pero recién estoy empezando :D , y sería extraordinario si hay una mejor manera.

Gracias por el aprendizaje.
logaritmos
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2016-09-05 19:47 @866

Re: Extraer matriz de archivo

Notapor explorer » 2016-09-11 14:53 @662

Si el trabajo consiste en leer todas las matrices, y sacar las medias de uno o varios puntos, es algo que se hace fácil en Perl.

Consiste en pasar las matrices a estructuras de arrays de arrays, en Perl, y luego, para cada punto del que queremos información, sacamos la media (sumamos todos los puntos de las mismas coordenadas y lo dividimos por el número de matrices).

El detalle al que hay que prestar atención en un problema así es al de no confundir líneas con columnas.

Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. my @puntos = (          # fila, columna, comenzando en 1 (no en 0)
  6.     [ 11,  7 ],
  7.     [  3, 17 ],
  8.     [  5, 10 ],
  9.     [  1,  1 ],
  10. );
  11.  
  12. #open my $SALIDA, '>', 'output.txt';
  13.  
  14. my @matriz_de_matrices;
  15.  
  16. my @archivos = <*.lst>;
  17.  
  18.  
  19. for my $archivo (@archivos) {
  20.  
  21.  
  22.     open my $LST, '<', $archivo;
  23.     while (<$LST>) {
  24.  
  25.         if (my $res  =  /SPECIES: NO2\s+LAYER/ .. /^\s+1\s+2/) {
  26.            
  27.             # $res indica qué línea de la matriz estamos leyendo
  28.             if ($res == 1) {                    # primera línea de la matriz
  29.                 push @matriz_de_matrices, [];   # creamos espacio para guardarla
  30.             }
  31.             #elsif ($res =~ /E0$/) {            # última línea
  32.             #}
  33.             else {                              # resto de líneas
  34.                 if (/^\s+(\d+) I (.+)$/) {      # si la línea comienza con un índice de fila
  35.                     my $y = $1;                 # guardamos el índica
  36.                     my $fila = $2;
  37.                     my @columnas = split " ", $fila;
  38.  
  39.                     #print $SALIDA "$y | @columnas\n";
  40.  
  41.                     $matriz_de_matrices[-1][$y] = [ 0, @columnas ];
  42.                 }
  43.            
  44.             }
  45.         }
  46.     }
  47.     close $LST;
  48. }
  49.  
  50. #close $SALIDA;
  51.  
  52. #use Data::Dumper::Perltidy;
  53. #print Dumper \@matriz_de_matrices;
  54.  
  55. say "Número de matrices: ", scalar @matriz_de_matrices;
  56.  
  57. for my $punto_ref (@puntos) {
  58.     my($fila, $columna) = @$punto_ref;
  59.    
  60.     my $suma = 0;
  61.  
  62.     for my $matriz_ref (@matriz_de_matrices) {
  63.         $suma += $matriz_ref->[$fila]->[$columna];      # sumamos elementos en la misma pos. para todas las matrices
  64.     }
  65.  
  66.     my $media = $suma / @matriz_de_matrices;
  67.  
  68.     say "Media del punto [$fila][$columna] = $media";
  69. }
  70.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Número de matrices: 10
Media del punto [11][7] = 0.9
Media del punto [3][17] = 7.7
Media del punto [5][10] = 1.5
Media del punto [1][1] = 9.2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Aquí, vamos leyendo las matrices, por líneas. Cuando detectamos la primera línea de una matriz, creamos un nuevo elemento en el array que las almacenará todas (push()). Si es una línea normal, sacamos todas las columnas, y la guardamos en el índice de fila correspondiente.

La línea 41 quiere decir: "guarda en la posición $y de la anterior matriz (-1), la nueva fila que te voy a dar, que es un '0', seguido de todas las @columnas que he encontrado".

Lo del '0' quizás no se entienda al principio. Los arrays, en Perl, comienzan siempre en '0', pero veo que las matrices que vas a manejar usan índices de filas y columnas basadas en '1'. Por eso, "metemos" una columna más, delante de las demás, para que cuando busquemos una determinada coordenada, como seguramente estará basada en 1, localizará la columna correcta. La fila también será la correcta porque estamos usando los índices que hay en el propio archivo. Suponemos que nunca nos mandarán calcular puntos de la primera columna o de la primera fila.
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 7 invitados