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 :

expression régulière - selection information


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut expression régulière - selection information
    Bonjour à tous,
    Je suis confrontée à un problème que je n'arrive pas à résoudre;
    j'ai un fichier qui ressemble à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >FBgn0034742 type=gene; loc=2R:complement(18487910..18493140); ID=FBgn0034742; name=CG4294; dbxref=FlyBase:FBan0004294,FlyBase:FBgn0034742,FlyBase_Annotation_IDs:CG4294,GB:AA202210,GB:AA263903,GB:AW941631,UniProt/TrEMBL:Q9W238,GB_protein:AAF46861,INTERPRO:IPR019607,EntrezGene:37579,InterologFinder:37579,BIOGRID:63195,DroID:FBgn0034742,DRSC:FBgn0034742,FLIGHT:FBgn0034742,FlyAtlas:CG4294-RA,FlyMine:FBgn0034742,GenomeRNAi:37579,modMine:FBgn0034742; derived_computed_cyto=58F1-58F1%3B Limits computationally determined from genome sequence between @P{lacW}l(2)k13211<up>k13211</up>@%26@P{EP}EP827@ and @P{PZ}l(2)rG270<up>rG270</up>@; gbunit=AE013599; MD5=de181d96921fe601ef2dbf64c2181d6a; length=5231; release=r5.44; species=Dmel; 
    >FBgn0051637 type=gene; loc=2L:6498642..6526996; ID=FBgn0051637; name=CG31637; dbxref=FlyBase:FBgn0051637,FlyBase:FBan0031637,FlyBase_Annotation_IDs:CG31637,GB_protein:AAF52398,FlyBase:FBgn0031827,FlyBase:FBgn0031828,FlyBase:FBgn0062239,GB:AA817254,GB:AI061950,GB:AW943257,GB:AX093983,GB:AY058647,GB_protein:AAL13876,UniProt/TrEMBL:Q9VMC3,INTERPRO:IPR000863,EntrezGene:33914,InterologFinder:33914,BIOGRID:60070,DPIM:FBgn0051637,DroID:FBgn0051637,DRSC:FBgn0051637,FLIGHT:FBgn0051637,FlyAtlas:CG31637-RA,FlyMine:FBgn0051637,GenomeRNAi:33914,modMine:FBgn0051637; derived_computed_cyto=26D9-26E1%3B Limits computationally determined from genome sequence between @P{EP}Sec61α<up>EP2180</up>@ and @P{lacW}Ate1<up>k10809</up>@; gbunit=AE014134; MD5=557958edbe7c9a6a3fb874b35a21df39; length=28355; release=r5.44; species=Dmel; 
    >FBgn0085370 type=gene; loc=2L:complement(18532728..18571648); ID=FBgn0085370; name=Pde11; dbxref=FlyBase_Annotation_IDs:CG10231,GB_protein:AAF53676,GB_protein:AAF53675,FlyBase_Annotation_IDs:CG34341,FlyBase:FBgn0085370,FlyBase_Annotation_IDs:CG15159,GB_protein:AAM52774,GB:CZ481948,FlyBase:FBan0010231,UniProt/Swiss-Prot:Q9VJ79,GB:BG635636,GB:CZ489023,GB:CZ489022,GB:CZ473163,GB:CZ478706,INTERPRO:IPR003607,INTERPRO:IPR002073,INTERPRO:IPR003018,GB:AY122262,GB:CZ481559,FlyBase:FBgn0032686,FlyBase:FBgn0032687,FlyBase:FBan0015159,EntrezGene:35107,INTERPRO:IPR023088,INTERPRO:IPR023174,GB_protein:ADV37087,GB_protein:ADV37086,InterologFinder:35107,BIOGRID:61102,DroID:FBgn0085370,DRSC:FBgn0085370,FLIGHT:FBgn0085370,FlyAtlas:CG15159-RA;CG10231-RA,FlyMine:FBgn0085370,GenomeRNAi:35107,modMine:FBgn0085370; derived_computed_cyto=36F6-36F6%3B Limits computationally determined from genome sequence between @P{lacW}Aac11<up>k06710</up>@ and @P{EP}CG10413<up>EP2164</up>@; gbunit=AE014134; MD5=0979ee8fe04ac9fcf62386a2916a9a26; length=38921; release=r5.44; species=Dmel;
    Donc l'information que je souhaite récuperer se trouve toujours dans la "variable" dbxref, après "FlyBase_Annotation_IDs:" (en gras) ... mais comme dans l'exemple, cette info ne se trouve pas toujours au meme moment dans la variable, je ne peux donc pas utiliser le morceau de code que j'ai ecris ci dessous ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while ( my $ligne = <$inp1> ) {
    	chomp $ligne;
    	if ( $ligne =~ m{^>} ) {
    		my ($type, $loc,$ID,$name,$dbxref,$other,$gbunit,$MD5,$length,$release,$species ) = split /;/, $ligne;
    		my ($flybase,$flybase2,$CG,undef)=split /,/, $dbxref;
    		$ID   =~ s{ *ID=}{};
    		$loc   =~ s{ *loc=}{};
    		$name =~ s{ *name=}{};
    		$CG =~ s{ *}{FlyBase_Annotation_IDs:};
    		my ($chr,$coor)=split /:/,$loc;
    		print ">$ID;$name;$CG;chr$chr\n";
     
    	}
    Quelqu'un pourrait m'aider svp ?

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Pourquoi ne par travailler avec une tableau de hashage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while ( my $ligne = <$inp1> ) {
      chomp $ligne;
      if ( $ligne =~ m{^>} ) {
      my %data = map { split /=/, $_ } split /;/, $ligne;
      my ($chr, $coor) = split /:/, $data{loc};
      my ($flybase,$flybase2,$CG)=split /,/, $data{dbxref};
      print ">$data{ID};$data{name};$data{CG};chr$chr\n";
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Je ne peux pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($flybase,$flybase2,$CG)=split /,/, $data{dbxref};
    Car dans la variable dbxref, $flybase,$flybase2,$CG ne sont pas toujours dans cet ordre là (cf mon exemple ci dessus); $CG (que je veux récuperer) n'est pas tout le temps en 3é position, mais il est toujours après "FlyBase_Annotation_IDs:" dans dbxref ...

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Alors procède comme j'ai fait pour le niveau supérieur, avec %data :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my %dbxref;
    foreach my $data (split /,/, $dbxref) {
      my ($key, $val) = split /:/, $data;
      $dbxref{$key} = [] if !exists $dbxref{$key};
      push $dbxref{$key}, $val;
    }
    J'ai utilisé un tableau pour les éléments de %dbxref, car il peut y avoir plusieurs valeurs différentes pour la même clé (plusieurs Flybase, Flybase_annotation_IDs, ...).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Je ne suis pas sûre d'avoir bien compris, mais j'ai fait comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while ( my $ligne = <$inp1> ) {
    	chomp $ligne;
    	if ( $ligne =~ m{^>} ) {
    		my ($type, $loc,$ID,$name,$dbxref,$other,$gbunit,$MD5,$length,$release,$species ) = split /;/, $ligne;
    		#my %data = map { split /=/, $_ } split /;/, $ligne; # creer un hash avec $data tous les x de x=nianiania
     
    		foreach my $data (split /,/, $dbxref) {
      			my ($key, $val) = split /:/, $data;
      			$dbxref{$key} = [] if !exists $dbxref{$key};
      			push $dbxref{$key}, $val;
    		}
    	}
    }
    J'ai l'erreur suivante que je ne comprends pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type of arg 1 to push must be array (not hash element) at entete_fasta.pl line 28, near "$val;"
    Execution of entete_fasta.pl aborted due to compilation errors.
    J'ai modifié par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    push @{$dbxref{$key}}, $val;
    Et si j'ai bien compris, %dbxef contient toutes les valeurs, dont "FlyBase_Annotation_IDs" et sa valeur, mais comment afficher cette valeur la et pas une autre ?
    avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while( my ($k,$v) = each(%dbxref) ) {
       print "$v\n" if($k eq 'FlyBase_Annotation_IDs')
    }

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par Isabella83 Voir le message
    J'ai modifié par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    push @{$dbxref{$key}}, $val;
    Ce qui est très bien, désolé pour l'erreur, je n'ai pas testé avant de poster.
    Et si j'ai bien compris, %dbxef contient toutes les valeurs, dont "FlyBase_Annotation_IDs" et sa valeur, mais comment afficher cette valeur la et pas une autre ?
    avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while( my ($k,$v) = each(%dbxref) ) {
       print "$v\n" if($k eq 'FlyBase_Annotation_IDs')
    }
    Il y a plus simple : concaténer (ou faire toute autre opération d'agglomération) toutes les valeurs du tableau référencé par $dbxref{FlyBase_Annnotation_IDs} :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print join ",", @{$dbxref{FlyBase_Annnotation_IDs}};
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Finalement, mon code est comme ceci :

    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
    GetOptions("fasta=s" => \$fasta_file, "file=s" => \$file_file, "out=s" => \$output); 
    open(my $inp1,'<',$fasta_file) or die "$fasta_file : $!\n\n";
    open(my $inp2,'<',$file_file) or die "$file_file : $!\n\n";
    open(my $out,'>',$output) or die "$output : $!\n\n";
     
    while ( my $ligne = <$inp1> ) {
    	chomp $ligne;
    	if ( $ligne =~ m{^>} ) {
    		my ($type, $loc,$ID,$name,$dbxref,undef ) = split /;/, $ligne;
    		$ID   =~ s{ *ID=}{};
    		#print "$ID\n";
    		$loc   =~ s{ *loc=}{};
    		$name =~ s{ *name=}{};
    		my ($chr,$coor)=split /:/,$loc;
    		foreach my $data (split /,/, $dbxref) {
      			my ($key, $val) = split /:/, $data;
      			$dbxref{$key} = [] if !exists $dbxref{$key};
      			push (@{$dbxref{$key}}, join(';',$val,$ID,$name,$chr));
    		}
    	}
    }
     
    foreach my $k (keys(%dbxref)){
    	foreach my $v (@{$dbxref{$k}}){
    		if($k eq 'FlyBase_Annotation_IDs'){
    			print "$v\n";
    			my ($symbol,$FBgn,$name,$chr) = split /;/, $v;
    			#print "$FBgn\n";
    			$hash{$FBgn}->{'value'} = join (';',$symbol,$name,$chr);
    		}
    	}
    }
     
     
     
    while ( <$inp2> ) {
    	chomp $_;
    	#print "$_\n";
    	if ($_ =~ m{^>} ) {
    		my ($type_c,$loc_c,$ID_c,undef) = split /;/, $_;
    		$ID_c =~ s{ *ID=}{};
    		#print "$ID_c\n";
    		print {$out}">$ID_c;$hash{$ID_c}->{'value'}\n"	
    	}
    	else{
    		print {$out} "$_\n";
    	}		 
    }
    Je n'ai pas trouvé plus simple pour aficher toutes les valeurs dont j'ai besoin ...
    Cependant, pour certaines valeurs, j'ai une erreur, aucune valeur dans "FlyBase_Annotation_IDs" n'est retournée alors qu'il y a bien les data, j'ai mis en dessous les lignes qui posent problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >FBgn0064225 type=gene; loc=2L:complement(22427533..22429419); ID=FBgn0064225; name=RpL5; dbxref=FlyBase_Annotation_IDs:CG17489,FlyBase:FBan0017489,FlyBase:FBgn0064225,GB_protein:ACZ94330,GB_protein:EAA46016,GB_protein:EAA46019,FlyBase:FBgn0040008,FlyBase:FBgn0040061,GB:AABU01002768,GB_protein:EAA46016,GB_protein:EAA46017,GB_protein:EAA46018,GB_protein:EAA46019,GB_protein:EAA46020,GB:AF195190,GB_protein:AAF27819,GB:AY071305,GB_protein:AAL48927,GB:BI236965,UniProt/TrEMBL:Q9NIU2,UniProt/Swiss-Prot:Q9W5R8,INTERPRO:IPR005484,INTERPRO:IPR005485,EntrezGene:3355124,UniProt/TrEMBL:Q6NL81,InterologFinder:3355124,BIOGRID:78249,DPIM:FBgn0064225,DroID:FBgn0064225,DRSC:FBgn0064225,FLIGHT:FBgn0064225,FlyAtlas:CG17489-RE,FlyMine:FBgn0064225,GenomeRNAi:3355124,modMine:FBgn0064225; derived_computed_cyto=40F7-40F7; MD5=a2117b1dfb8081bd9271f7d178c10602; length=1887; release=r5.44; species=Dmel; 
    >FBgn0263750 type=gene; loc=3R:5181678..5183403; ID=FBgn0263750; name=CG43675; dbxref=FlyBase_Annotation_IDs:CG43675,FlyBase:FBgn0263750,GB_protein:AAN13419,GB_protein:AAO41524,GB_protein:AAZ52520,FlyBase:FBgn0053936,FlyBase:FBgn0037681,FlyBase:FBgn0053188,UniProt/TrEMBL:Q8INP3,UniProt/TrEMBL:Q4AB40,UniProt/TrEMBL:Q8T3W4,INTERPRO:IPR000058; derived_computed_cyto=85D11-85D11; MD5=2158e6db49af7317d56cdede36163fda; length=1726; release=r5.44; species=Dmel; 
    >FBgn0260441 type=gene; loc=3L:13016456..13017862; ID=FBgn0260441; name=RpS12; dbxref=FlyBase_Annotation_IDs:CG11271,FlyBase:FBgn0036339,FlyBase:FBan0011271,GB_protein:AAN11845,EntrezGene:39480,FlyBase:FBgn0011809,FlyBase:FBgn0064825,GB:AA820275,GB:AI455377,GB:AQ026389,GB:AY058531,GB_protein:AAL13760,GB:BI588615,GB:BT001803,GB:CZ470567,GB:X89659,GB_protein:CAA61806,UniProt/Swiss-Prot:P80455,INTERPRO:IPR000530,INTERPRO:IPR004038,FlyBase:FBgn0260441,FlyBase:FBgn0014027,InterologFinder:39480,BIOGRID:64826,DroID:FBgn0260441,DRSC:FBgn0260441,FLIGHT:FBgn0260441,FlyMine:FBgn0260441,GenomeRNAi:39480,modMine:FBgn0260441; derived_computed_cyto=69F5-69F5; gbunit=AE014296; MD5=82c5872695ceb5b7370f6e7b824d5ecb; length=1407; release=r5.44; species=Dmel; 
    >FBgn0263749 type=gene; loc=3R:5165938..5188666; ID=FBgn0263749; name=CG43674; dbxref=FlyBase_Annotation_IDs:CG43674,FlyBase:FBgn0263749,GB_protein:AAF54360,GB_protein:AAF54361,GB_protein:AAN71487,GB:CZ466470,GB:CZ467045,GB:CZ467788,GB:CZ469653,GB:CZ469890,GB:CZ469891,GB:CZ469929,GB:CZ469935,GB:CZ472137,GB:CZ474194,GB:CZ475752,GB:CZ476341,GB:CZ477980,GB:CZ478207,GB:CZ479108,GB:CZ483129,GB:CZ483864,GB:CZ484048,GB:CZ484181,GB:CZ485025,GB:CZ485612,GB:CZ485940,GB:CZ486378,GB:CZ487202,FlyBase:FBgn0053936,FlyBase:FBgn0040535,FlyBase:FBgn0053188,FlyBase:FBgn0064858,UniProt/TrEMBL:Q9VHF4,INTERPRO:IPR000058,INTERPRO:IPR002653; derived_computed_cyto=85D11-85D11; MD5=4f64d7a7130079932f6d642d229907dd; length=22729; release=r5.44; species=Dmel;

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Attention, le fait de n'avoir qu'un hash %dbxref pour toutes les séquences du fichier fasta fait que chaque nouvelle séquence complète ou supprime les éléments de l'ancienne.
    Il faut remplir utilise un %dbxref local à la boucle sur les $FBgn qui initialise %hash, et stocker ce hash %dbxref dans l'élément $hash{$FBgn} :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash{$FBgn}->{dbxref} = { %dbxref };
    Je ne suis pas sur d'être assez clair, mais pour l'être un peu plus, il faudrait la totalité du script.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

Discussions similaires

  1. expression régulière. Selection
    Par Ruyneau dans le forum Général Python
    Réponses: 2
    Dernier message: 23/02/2012, 15h34
  2. [RegEx] Réduire la selection d'une expression régulière
    Par spelou dans le forum Langage
    Réponses: 6
    Dernier message: 25/05/2009, 19h33
  3. Expressions régulières dans un SELECT
    Par CinePhil dans le forum Requêtes
    Réponses: 5
    Dernier message: 01/10/2008, 13h08
  4. Expression réguliére input / select
    Par bdptaki dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/07/2008, 14h57
  5. Réponses: 6
    Dernier message: 30/01/2008, 22h20

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