IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bioinformatique Perl Discussion :

Problème d'expression régulière pour parser un fichier


Sujet :

Bioinformatique Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 13
    Points : 12
    Points
    12
    Par défaut Problème d'expression régulière pour parser un fichier
    Bonjour,
    Je dois parser un fichier qui se compose comme montré ci-dessous.
    Je ne veux sélectionner que la ligne qui commence par I jusqu'à // et la ligne T.
    Pour le moment je veux seulement afficher le texte commençant par H jusqu'à //.
    J'ai écrit le code suivant mais sans succès.
    Il me renvoie systématiquement 1 mais je ne comprends pas pourquoi.

    Merci par avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    use strict;
    use warnings;
    my $nom='';
    my $annotation ='';
    my $dna ='';
    my $record = '';
    my $filename = 'ess.txt';
    my $save_input_separator = $/;
    #Ouverture du fichier
    open(GBFILE, $filename) or die  "Cannot open file $filename";
     
     
    {
    $/="//\n";
    $record = <GBFILE>;
    }
     
    $/ = $save_input_separator;
    $nom=($record=~ /(.*)\/\/\n/s);
    #print $record;
    print $nom;
    exit;

    H ANDN920101
    D alpha-CH chemical shifts (Andersen et al., 1992)
    R LIT:1810048b PMID:1575719
    A Andersen, N.H., Cao, B. and Chen, C.
    T Peptide/protein structure analysis using the chemical shift index method:
    upfield alpha-CH values reveal dynamic helices and aL sites
    J Biochem. and Biophys. Res. Comm. 184, 1008-1014 (1992)
    C BUNA790102 0.949
    I A/L R/K N/M D/F C/P Q/S E/T G/W H/Y I/V
    4.35 4.38 4.75 4.76 4.65 4.37 4.29 3.97 4.63 3.95
    4.17 4.36 4.52 4.66 4.44 4.50 4.35 4.70 4.60 3.95
    //
    H ARGP820101
    D Hydrophobicity index (Argos et al., 1982)
    R LIT:0901079b PMID:7151796
    A Argos, P., Rao, J.K.M. and Hargrave, P.A.
    T Structural prediction of membrane-bound proteins
    J Eur. J. Biochem. 128, 565-575 (1982)
    C JOND750101 1.000 SIMZ760101 0.967 GOLD730101 0.936
    TAKK010101 0.906 MEEJ810101 0.891 ROSM880104 0.872
    CIDH920105 0.867 LEVM760106 0.865 CIDH920102 0.862
    MEEJ800102 0.855 MEEJ810102 0.853 ZHOH040101 0.841
    CIDH920103 0.827 PLIV810101 0.820 CIDH920104 0.819
    LEVM760107 0.806 NOZY710101 0.800 GUYH850103 -0.808
    PARJ860101 -0.835 WOLS870101 -0.838 BULH740101 -0.854
    I A/L R/K N/M D/F C/P Q/S E/T G/W H/Y I/V
    0.61 0.60 0.06 0.46 1.07 0. 0.47 0.07 0.61 2.22
    1.53 1.15 1.18 2.02 1.95 0.05 0.05 2.65 1.88 1.32
    //

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    je n'ai pas pris le temps de regarder en détail ton algo, mais ces quatre lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $nom="'';
    my $annotation ="'';
    my $dna ="'';
    my $record = "'';
    sont erronées, il leur manque le guillemet fermant (ou, plutôt, il y a un guillemet entrant en trop).

    J'ajoute que la façon recommandée d'ouvrir un fichier en lecture n'est pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    unless (open(GBFILE, $filename)) {
    	 print "Cannot open file \"$filename\"\n\n";
    exit; }
    mais plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    open my $GBFILE, "<" $filename or die "Cannot open $filename $!";
    et que si tu veux modifier temporairement une variable globale telle que $/, il vaut mieux faire comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
        local $/ = "//\n";
        $record = <GBFILE>;
    }
    Je ne pense pas que le reste de l'algo fonctionne, mais je n'ai pas le temps de vérifier tout de suite, et ne eux tester sur ma tablette mobile.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Pour l'initialisation des variables je me suis un peu trompé quand je l'ai entré sur le site. A présent cela est réglé.
    Mon problème principal vient du fait que l'expression régulière ne donne pas les résultats que j'espérais et j'ignore pourquoi.

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour Lionel,

    Voici un exemple de code, pour récupérer un groupe de lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    my $filename = 'ess.txt';
     
    local $/;
    open my $GBFILE, "<", $filename or die "Can't open $filename: $!\n";
     
    # une ligne qui commence par un I jusqu'à la ligne //
    ( my $content) = <$GBFILE>  =~ m{\n(I(.*\n)+//)};
    print "$content\n";
    Que veux-tu récupérer dans $nom ? Tu peux parcourir ton fichier lignes par lignes, de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    if (-f $filename){
    	open (GBFILE, $filename) or die "Couldn't open $filename, $!"; 
    	while (my $l =<GBFILE>){
    		if ($l=~ m/(xyz)/){
    			($nom) = $1;
    		}
    	}
    	close(GBFILE);
    }
     
    print "$nom\n";
    ...mais si tes données à récupérer sont sur plusieurs lignes, cela ne fonctionnera pas ainsi, tu dois concaténer tes lignes
    -- Jasmine --

  5. #5
    Membre averti
    Avatar de magicshark
    Homme Profil pro
    Dans une SS2I donc pas que JAVA
    Inscrit en
    Octobre 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dans une SS2I donc pas que JAVA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 133
    Points : 320
    Points
    320
    Par défaut
    Tu pourrais nous donner la sortie que tu souhaites obtenir car j'ai fait un truc mais j'ai pas très bien compris ce que tu attendais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #!/usr/bin/perl
    #
    # @File regexpFile.pl
    # @Author magicshark
    # @Created 12 juin 2015 11:17:04
    #
     
    use strict;
    use warnings;
     
    my $filename = 'regexpFile.txt';
    open my $GBFILE, "<", $filename or die "Can't open $filename: $!\n";
     
    # une ligne qui commence par un I ou H jusqu'à la ligne //
    while (my $ligne = <$GBFILE>)
    {
        if($ligne =~ m/^(I|H)/)
        {
            print "trouver \n".$ligne;
            while($ligne !~ m/^\/\//)
            {
                if($ligne = <$GBFILE>)
                {
                    print $ligne;
                }
                else
                {
                    last;
                }
            }
        }
    }
    close($GBFILE);
    v2 qui je crois te donnes ce que tu attend mais y a mieux je me suis perdu dans mon algo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #!/usr/bin/perl
    #
    # @File regexpFile.pl
    # @Author magicshark
    # @Created 12 juin 2015 11:17:04
    #
     
    use strict;
    use warnings;
     
    my $filename = 'regexpFile.txt';
    open my $GBFILE, "<", $filename or die "Can't open $filename: $!\n";
     
    # une ligne qui commence par un I jusqu'à la ligne //
    my $continue = 0;
    while (my $ligne = <$GBFILE>)
    {
        if($ligne =~ m/^(H )/)
        {
            print "trouver \n";
            while($ligne !~ m/^\/\//)
            {
                if($ligne = <$GBFILE>)
                {
                    if($ligne =~ m/^T /){
                        print $ligne;
                        $continue = 1;
                        while($continue == 1)
                        {
                            if($ligne = <$GBFILE>)
                            {   
                                if($ligne !~ m/^([A-Za-z] )/)
                                {
                                    print $ligne;
                                }
                                else
                                {
                                    $continue = 0;
                                }
                            }
                            else
                            {
                                $continue = -1;
                            }
                        }
                        if($continue == -1)
                        {
                            last;
                        }
                    }
                    elsif($ligne =~ m/^I /)
                    {
                        print $ligne;
                        while($ligne !~ m/^\/\//)
                        {
                            if($ligne = <$GBFILE>)
                            {
                                print $ligne;
                            }
                            else
                            {
                                last;
                            }
                        }
                    }
                }
                else
                {
                    last;
                }
            }
        }
    }
     
    close($GBFILE);
    Pourquoi faire simple quand on peut faire compliqué.

Discussions similaires

  1. Expression régulière pour parser le tnsnames.oRa
    Par GreatDeveloperOnizuka dans le forum C#
    Réponses: 2
    Dernier message: 05/06/2013, 10h49
  2. [DOM4J] Problème pour "parser" un fichier XML avec accents
    Par mlny84 dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 26/11/2007, 19h06
  3. [JDOM] Problème pour parser un fichier XML [débutant]
    Par adn013 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 16/05/2007, 12h00
  4. Expression régulière pour récupérer le nom d'un fichier
    Par calimero2611 dans le forum Langage
    Réponses: 5
    Dernier message: 24/02/2006, 19h00
  5. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo