• Publicidad

Extracción de datos de una variable

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

Extracción de datos de una variable

Notapor ZEROWARRIOR » 2009-06-26 10:57 @498

Saludos a todos,

Esta es mi primera participación en un foro. Soy nuevo en el manejo de Perl, y tengo esta situación:
tengo un archivo CGI en el cual recibo por POST un texto correspondiente a un archivo .mol (donde se encuentran datos de moléculas) como este:

Código: Seleccionar todo
MOLECULE=353;CONFORMATION=0;

 21 23  0  0  0  0  0  0  0  0999 V2000
   -0.3756    0.2209    0.0342 N   0  0  0  0  0  0  0  0  0  0  0  0
   -0.3188   -1.2033    0.0172 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.9787    0.6665    0.0040 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.8320   -0.4359   -0.0305 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.0045   -1.6117   -0.0219 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.1134   -3.4204    0.0139 N   0  0  0  0  0  0  0  0  0  0  0  0
   -1.3746   -2.1217    0.0349 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.2594   -2.9866   -0.0436 C   0  0  0  0  0  0  0  0  0  0  0  0
    3.2219   -0.2450   -0.0645 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.4506    1.9857    0.0065 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.1723   -3.8486   -0.0245 C   0  0  0  0  0  0  0  0  0  0  0  0
    3.7055    1.0571   -0.0625 C   0  0  0  0  0  0  0  0  0  0  0  0
    2.8264    2.1643   -0.0272 C   0  0  0  0  0  0  0  0  0  0  0  0
    3.2285    3.1442   -0.0266 H   0  0  0  0  0  0
    4.7503    1.2281   -0.0877 H   0  0  0  0  0  0
    0.3310   -4.8956   -0.0401 H   0  0  0  0  0  0
    0.7822    2.8067    0.0330 H   0  0  0  0  0  0
    3.8818   -1.0729   -0.0909 H   0  0  0  0  0  0
    2.2519   -3.3549   -0.0737 H   0  0  0  0  0  0
   -2.3807   -1.7920    0.0649 H   0  0  0  0  0  0
   -1.2234    0.8096    0.0630 H   0  0  0  0  0  0
  2  1  1  0  0  0  0
  3  1  1  0  0  0  0
  4  3  2  0  0  0  0
  5  2  2  0  0  0  0
  6  7  2  0  0  0  0
  7  2  1  0  0  0  0
  8  5  1  0  0  0  0
  9  4  1  0  0  0  0
 10  3  1  0  0  0  0
 11  8  2  0  0  0  0
 12 13  1  0  0  0  0
 13 10  2  0  0  0  0
  5  4  1  0  0  0  0
  9 12  2  0  0  0  0
  6 11  1  0  0  0  0
 13 14  1  0  0  0
 12 15  1  0  0  0
 11 16  1  0  0  0
 10 17  1  0  0  0
  9 18  1  0  0  0
  8 19  1  0  0  0
  7 20  1  0  0  0
  1 21  1  0  0  0
M  END
>  <rn>
244-63-3

>  <MAB_ENERGIES>
 33.57 0.75 29.77 1.54 1.51 2.12 -2.12 0.00


y necesito extraer de allí las columnas correspondientes a las coordenadas X, Y y Z de los átomos que conforman la molécula, junto con el símbolo, o sea, algo así:

Código: Seleccionar todo
 -0.3756    0.2209    0.0342 N   
   -0.3188   -1.2033    0.0172 C
    0.9787    0.6665    0.0040 C 
    1.8320   -0.4359   -0.0305 C
    1.0045   -1.6117   -0.0219 C
   -1.1134   -3.4204    0.0139 N
   -1.3746   -2.1217    0.0349 C
    1.2594   -2.9866   -0.0436 C
    3.2219   -0.2450   -0.0645 C
    1.4506    1.9857    0.0065 C
    0.1723   -3.8486   -0.0245 C
    3.7055    1.0571   -0.0625 C
    2.8264    2.1643   -0.0272 C
    3.2285    3.1442   -0.0266 H
    4.7503    1.2281   -0.0877 H
    0.3310   -4.8956   -0.0401 H
    0.7822    2.8067    0.0330 H
    3.8818   -1.0729   -0.0909 H
    2.2519   -3.3549   -0.0737 H
   -2.3807   -1.7920    0.0649 H
   -1.2234    0.8096    0.0630 H


No tengo ni la menor idea de cómo hacerlo. Sin embargo he leído acerca de la potencia de Perl en el manejo de textos y de que se pueden usar expresiones regulares para esto.

Agradezco cualquier ayuda que me puedan brindar.
ZEROWARRIOR
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2009-06-26 10:45 @489

Publicidad

Notapor explorer » 2009-06-26 12:17 @553

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

Efectivamente, con Perl puedes realizar operaciones sencillas de procesado de texto. En este caso, trabajo con columnas y una pequeña expresión regular, para saber qué líneas son las que nos interesan.

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

my $mol = 'MOLECULE=353;CONFORMATION=0;

 21 23  0  0  0  0  0  0  0  0999 V2000
   -0.3756    0.2209    0.0342 N   0  0  0  0  0  0  0  0  0  0  0  0
   -0.3188   -1.2033    0.0172 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.9787    0.6665    0.0040 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.8320   -0.4359   -0.0305 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.0045   -1.6117   -0.0219 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.1134   -3.4204    0.0139 N   0  0  0  0  0  0  0  0  0  0  0  0
   -1.3746   -2.1217    0.0349 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.2594   -2.9866   -0.0436 C   0  0  0  0  0  0  0  0  0  0  0  0
    3.2219   -0.2450   -0.0645 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.4506    1.9857    0.0065 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.1723   -3.8486   -0.0245 C   0  0  0  0  0  0  0  0  0  0  0  0
    3.7055    1.0571   -0.0625 C   0  0  0  0  0  0  0  0  0  0  0  0
    2.8264    2.1643   -0.0272 C   0  0  0  0  0  0  0  0  0  0  0  0
    3.2285    3.1442   -0.0266 H   0  0  0  0  0  0
    4.7503    1.2281   -0.0877 H   0  0  0  0  0  0
    0.3310   -4.8956   -0.0401 H   0  0  0  0  0  0
    0.7822    2.8067    0.0330 H   0  0  0  0  0  0
    3.8818   -1.0729   -0.0909 H   0  0  0  0  0  0
    2.2519   -3.3549   -0.0737 H   0  0  0  0  0  0
   -2.3807   -1.7920    0.0649 H   0  0  0  0  0  0
   -1.2234    0.8096    0.0630 H   0  0  0  0  0  0
  2  1  1  0  0  0  0
  3  1  1  0  0  0  0
  4  3  2  0  0  0  0
  5  2  2  0  0  0  0
  6  7  2  0  0  0  0
  7  2  1  0  0  0  0
  8  5  1  0  0  0  0
  9  4  1  0  0  0  0
 10  3  1  0  0  0  0
 11  8  2  0  0  0  0
 12 13  1  0  0  0  0
 13 10  2  0  0  0  0
  5  4  1  0  0  0  0
  9 12  2  0  0  0  0
  6 11  1  0  0  0  0
 13 14  1  0  0  0
 12 15  1  0  0  0
 11 16  1  0  0  0
 10 17  1  0  0  0
  9 18  1  0  0  0
  8 19  1  0  0  0
  7 20  1  0  0  0
  1 21  1  0  0  0
M  END
>  <rn>
244-63-3

>  <MAB_ENERGIES>
 33.57 0.75 29.77 1.54 1.51 2.12 -2.12 0.00'
;

for my $linea (split "\n", $mol) {
    my @columnas = split " ", $linea;

    if ($columnas[3] and $columnas[3] =~ /^[NCH]$/) {
        print join("\t", @columnas[0..3]), "\n";
    }
}

__END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Lo que hacemos es:
  • Si hemos recibido todo el fichero en una variable escalar, con el primer split() conseguimos hacer un bucle por cada $línea
  • Por cada $linea, sacamos sus posibles @columnas, que están separadas por caracteres en blanco
  • Si la cuarta columna ($columnas[3]) existe Y, además, es una sola letra de las conocidas ([NHC]), entonces:
  • Sacamos por pantalla las 4 primeras columnas, separadas por un carácter tabulador (por ejemplo).
Sale:
Código: Seleccionar todo
-0.3756 0.2209  0.0342  N
-0.3188 -1.2033 0.0172  C
0.9787  0.6665  0.0040  C
1.8320  -0.4359 -0.0305 C
1.0045  -1.6117 -0.0219 C
-1.1134 -3.4204 0.0139  N
-1.3746 -2.1217 0.0349  C
1.2594  -2.9866 -0.0436 C
3.2219  -0.2450 -0.0645 C
1.4506  1.9857  0.0065  C
0.1723  -3.8486 -0.0245 C
3.7055  1.0571  -0.0625 C
2.8264  2.1643  -0.0272 C
3.2285  3.1442  -0.0266 H
4.7503  1.2281  -0.0877 H
0.3310  -4.8956 -0.0401 H
0.7822  2.8067  0.0330  H
3.8818  -1.0729 -0.0909 H
2.2519  -3.3549 -0.0737 H
-2.3807 -1.7920 0.0649  H
-1.2234 0.8096  0.0630  H
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 netsoul » 2009-06-26 13:20 @597

A mí también me funcionó este :D:

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

open A, "<molecula.mol";

while(<A>){
        if (/^(\s.+\d.[NCH])/){
         print "$1\n";
        };
}
close A;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Salida:
Código: Seleccionar todo
   -0.3756    0.2209    0.0342 N
   -0.3188   -1.2033    0.0172 C
    0.9787    0.6665    0.0040 C
    1.8320   -0.4359   -0.0305 C
    1.0045   -1.6117   -0.0219 C
   -1.1134   -3.4204    0.0139 N
   -1.3746   -2.1217    0.0349 C
    1.2594   -2.9866   -0.0436 C
    3.2219   -0.2450   -0.0645 C
    1.4506    1.9857    0.0065 C
    0.1723   -3.8486   -0.0245 C
    3.7055    1.0571   -0.0625 C
    2.8264    2.1643   -0.0272 C
    3.2285    3.1442   -0.0266 H
    4.7503    1.2281   -0.0877 H
    0.3310   -4.8956   -0.0401 H
    0.7822    2.8067    0.0330 H
    3.8818   -1.0729   -0.0909 H
    2.2519   -3.3549   -0.0737 H
   -2.3807   -1.7920    0.0649 H
   -1.2234    0.8096    0.0630 H

Pero aún creo que falta mejorarlo. :lol:
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Re: Extracción de datos de una variable

Notapor ZEROWARRIOR » 2009-07-07 09:38 @443

Muchas gracias por su ayuda, parece ser exactamente lo que necesito.
ZEROWARRIOR
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2009-06-26 10:45 @489


Volver a Básico

¿Quién está conectado?

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

cron