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

Langage Perl Discussion :

remanier un fichier avec des regex


Sujet :

Langage Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Par défaut remanier un fichier avec des regex
    Bonjour à tous,

    J'avais déjà posté concernant mon problème mais le bug du forum l'a effacé... du coup je retente ma chance !

    J'ai en entrée un fichier fasta se présentant sous la forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >segment749_1 
    SSGAKRSSRGSRDFSWAAYRFHATSANRNAVEPTSSEVWIWV*RH*ESNPSTIPAIAS
    RSASTVEISAARDCMSTSSSRLAAPNPLPTPGPT*SMWEGRTGVVSSIAVAKRFASFA
    TGASRRQTLGSQPSFVRLVSSTVSDSRLMTSAALSARASAQDRRTTAGTRRRPWWGSF
    DSLPRAPVRSR*RSPRSSKRGTRAS*RRWAW*CCGQCTSLGSRWRRLARPSAWIARSG
    PTCCTTTATTSGRL*STLRGVPKRTTPWLHISWELLHSEPSEAYAMARATSGCIC*WS
    YIHLSPCSAQTYT**ARSSVWPQTCGARARNRSHPGPVAYRRVS*RSEGCCAGRWRR*
    PR*RRSRWAQLLARWRRDRRSRGARSSGQTGGRRAR*GCSRTSSGTGARHRCASRPDR
    PQSRRGTRSTRCSERAT*RPRWRNAPTRSPPTPSRCGRHGAASRGTTRGALLHGVPF*
    GATAPRCTPVRTSGATCSR*PRSHSPSRSRR*
    on y voit notamment plein d'étoiles partout que je souhaite enlever... chaque séquence entre les étoiles correspond à un cadre de lecture, cette séquence pouvant se situer sur 2 lignes ou plus ou alors sur 3 lettres (en bleu)... il y a aussi des cadres qui ne donnent rien d'où le ** (en vert)...




    J'ai écrit un script en 2 temps et j'aimerais savoir si vous auriez des idées pour transformer les 2 parties en 1...

    1ère étape:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    foreach my $line (@file){
     
       if ($line =~ /\>/)
       {$line =~ s/\>/\n\>/g;}      # ajoute un retour à la ligne sinon on a un problème par la suite
       else
       {
       $line =~ s/\n//g;             #remplace le retour à la ligne par rien car on a des séquences sur plusieurs lignes
       $line =~ s/\*\*/\*/g;      # remplace les ** par une seule car on a pas de séquence
       $line =~ s/\*/\n/g;          # remplace toutes les * par un retour à la ligne qui permet de visualiser chaque séquence
    	}
        print $out $line;
    }
    pour obtenir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >segment749_1 
    SSGAKRSSRGSRDFSWAAYRFHATSANRNAVEPTSSEVWIWV
    RH
    ESNPSTIPAIASRSASTVEISAARDCMSTSSSRLAAPNPLPTPGPT
    SMWEGRTGVVSSIAVAKRFASFATGASRRQTLGSQPSFVRLVSSTVSDSRLMTSAALSARASAQDRRTTAGTRRRPWWGSFDSLPRAPVRSR
    RSPRSSKRGTRAS
    RRWAW
    CCGQCTSLGSRWRRLARPSAWIARSGPTCCTTTATTSGRL
    STLRGVPKRTTPWLHISWELLHSEPSEAYAMARATSGCIC
    WSYIHLSPCSAQTYT
    ARSSVWPQTCGARARNRSHPGPVAYRRVS
    2ème étape
    avec un print foreach line..

    J'obtiens:

    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
    >segment749_1 _ORF_1
    SSGAKRSSRGSRDFSWAAYRFHATSANRNAVEPTSSEVWIWV
    >segment749_1 _ORF_2
    RH
    >segment749_1 _ORF_3
    ESNPSTIPAIASRSASTVEISAARDCMSTSSSRLAAPNPLPTPGPT
    >segment749_1 _ORF_4
    SMWEGRTGVVSSIAVAKRFASFATGASRRQTLGSQPSFVRLVSSTVSDSRLMTSAALSARASAQDRRTTAGTRRRPWWGSFDSLPRAPVRSR
    >segment749_1 _ORF_5RSPRSSKRGTRAS
    >segment749_1 _ORF_6
    RRWAW
    >segment749_1 _ORF_7
    CCGQCTSLGSRWRRLARPSAWIARSGPTCCTTTATTSGRL
    >segment749_1 _ORF_8
    STLRGVPKRTTPWLHISWELLHSEPSEAYAMARATSGCIC
    >segment749_1 _ORF_9
    WSYIHLSPCSAQTYT
    >segment749_1 _ORF_10
    ARSSVWPQTCGARARNRSHPGPVAYRRVS
    >segment749_1 _ORF_11
    RSEGCCAGRWRR
    Donc voilà !! Merci d'avance pour vos conseils

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Tu peux utiliser le module Bio::SeqIO qui permet de traiter des fichiers fasta

    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use Bio::SeqIO;
     
     
    my $in  = Bio::SeqIO->new(-file => "P:/Perl/scripts/sequence.txt", '-format' => 'Fasta');
     
    my $i = 0;
    while ( my $seq = $in->next_seq()){
     
    	my @seq = split (/\*/,$seq->seq);
    	for (@seq){
    		if($_){
    			$i++;
    			print ">".$seq->primary_id."_ORF_".$i."\n".$_."\n";
    		}
    	}
    }

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Si tu n'as qu'une seule séquence par fichier, tu peux simplifier par

    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use Bio::SeqIO;
     
     
    my $i = 0;
     
    my $seq = Bio::SeqIO->new(-file => "P:/Perl/scripts/sequence.txt", '-format' => 'Fasta')->next_seq;
    my @seq = split (/\*/,$seq->seq);
    for (@seq){
    	if($_){
    		$i++;
    		print ">".$seq->primary_id."_ORF_".$i."\n".$_."\n";
    	}
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Par défaut
    MERCI !!
    Encore une fois Jasmine tu m'aides énormément....
    En fait je pensais pas que le module BioSeqIO pouvait être utilisé comme les séquences n'étaient pas séparées de la même façon que dans un fichier fasta classique... j'avais tenté une approche au début mais ça se concluait par un problème de hash (Bio::hash error je sais plus quoi.. ) du coup j'avais abandonné l'idée...
    Merci de m'avoir montré maintes fois l'utilité de ce module ! (je me passerai plus de lui là!)



  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Par défaut en fait....
    euhhh je viens de remarquer que le $i s'incrémente à chaque fois, en fait je voulais le remettre à 0 à chaque nouveau primary id...
    je continue mes recherches !

    C'est bon !

    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
    use Bio::SeqIO;
     
     
    my $in  = Bio::SeqIO->new(-file => "P:/Perl/scripts/sequence.txt", '-format' => 'Fasta');
     
    my $i = 0;
    while ( my $seq = $in->next_seq()){
     
            $i=0;
    	my @seq = split (/\*/,$seq->seq);
    	for (@seq){
    		if($_){
    			$i++;
    			print ">".$seq->primary_id."_ORF_".$i."\n".$_."\n";
    		}
    	}
    }
    MERCI encore Jasmine !!

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while ( my $seq = $in->next_seq()){
     
            my $i = 0;
    	my @seq = split (/\*/,$seq->seq);
    	for (@seq){
    		if($_){
    			$i++;
    			print ">".$seq->primary_id."_ORF_".$i."\n".$_."\n";
    		}
    	}
    }
    nb : tu peux directement déclarer le $i dans le while au lieu de le faire à l'extérieur (mais ce n'est qu'un détail).

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Par défaut
    Merci pour l'info je savais pas !!
    Mais le mettre dans le while, ça veut pas dire qu'on redéclare la variable à chaque tour de boucle?

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Mais le mettre dans le while, ça veut pas dire qu'on redéclare la variable à chaque tour de boucle?
    En effet, et elle reste locale à la boucle.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Par défaut
    ok merci !
    je pensais pas qu'on pouvait, je n'avais jamais testé de peur que cela crée un bug...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/05/2010, 20h32
  2. [ API JDIC ] Ouvrir un fichier avec des paramètres
    Par macmanus dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 11/05/2007, 15h32
  3. Problème de chemin de fichier avec des espaces
    Par Akronyme dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 11/12/2006, 17h12
  4. Réponses: 6
    Dernier message: 29/11/2006, 11h56
  5. Réponses: 1
    Dernier message: 31/10/2006, 15h06

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