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 :

hash de hash ?


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut hash de hash ?
    Bonjour à tous,
    Je ne vois pas du tout comment faire ce dont j'ai besoin (table de hash ou autre).
    J'ai un fichier ressemblant à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TTTA_1	+	TABOR_I	6122	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCAAAAAAAAA	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII	0	
    GGGA_1	+	TABOR_I	6122	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCAAAAAAAAA	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII	0	
    AGCC_1	+	GYPSY_I	6121	GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCAAAAAA	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII	0	
    AGCC_1	+	TABOR_I	6121	GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCAAAAAA	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII	0	
    TTTA_1	+	HELENA_RT	909	ATCACCCTGGATAAACGGCTCACCTT	IIIIIIIIIIIIIIIIIIIIIIIIII	0	
    TACC_3610	+	HELENA_RT	909	ATCACCCTGGATAAACGGCTCACCTT	IIIIIIIIIIIIIIIIIIIIIIIIII	0
    j'ai donc commencé mon script comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    my $fichier_bam = 'TE_clip18_0mm.bam';
    my %comptage;
    open my $fh, '<', $fichier_bam or die "Impossible de lire le fichier $fichier_bed\n";
    while ( my $ligne = <$fh> ) {
    	chomp $ligne;
    	my ($ID,$sens,$ET,$pos,$seq,$qual,$count) = split /\t/, $ligne;
     
    }
     
    close $fh;
    ce que j'aimerai avoir, c'est pour chaque $ID, le nombre de $ET associé. Je ne vois pas du tout comment faire avec un hash ?

    Dans l'exemple de fichier que j'ai donné, je voudrais par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TTTA_1 2
    GGGA_1 1
    AGCC_1 2
    TACC_3610 1
    et du coup n'obtenir que les lignes pour lesquelles la seconde valeur = 1
    donc dans l'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GGGA_1	+	TABOR_I	6122	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCAAAAAAAAA	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
    TACC_3610	+	HELENA_RT	909	ATCACCCTGGATAAACGGCTCACCTT	IIIIIIIIIIIIIIIIIIIIIIIIII	0	0
    Merci d'avance pour votre aide et bonne journée à tous.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    En quoi un $ET est associé à un $ID?
    Pourquoi la valeur à trouver pour TACC_3610 devrait être 2 dans l'exemple alors qu'il est présent une seule fois dans le fichier?

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    J'avais fait une erreur pour TACC je l'ai rectifiée ....
    En fait je veux savoir à combien de $ET un $ID est associé .... et je ne vois pas du tout comment faire, je débute en programmation ...

  4. #4
    Membre averti Avatar de zanker
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut
    Un exemple de code que je n'ai pas testé mais qui devrait y ressembler.
    On stocke dans la table de hashage le nombre d'occurence + les infos à conserver.
    Pour ça on utilise d'autres tables de hashage dans %comptage en y accédant par leur référence.

    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
    my $fichier_bam = 'TE_clip18_0mm.bam';
    my %comptage;
    open my $fh, '<', $fichier_bam or die "Impossible de lire le fichier $fichier_bed\n";
    while ( my $ligne = <$fh> ) {
    	chomp $ligne;
    	my ($ID,undef,$ET) = split /\t/, $ligne;
    	$comptage{$ID}->{'count'} = $comptage{$ID}->{'count'} + 1;
    	push(@{$comptage{$ID}->{'data'}}, $ET);
    }
    close $fh;
    foreach my $ID (keys(%comptage)) {
    	if ($comptage{$ID}->{'count'} == 1)
    	{
    		print("ID=$ID\tET=".join("\t", @{$comptage{$ID}->{'data'}})."\n");
    	}
    }
    Voilà!

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    Merci pour votre aide,
    j'ai ce message d'erreur que je ne comprends pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Use of uninitialized value in addition (+) at transposons.pl line 11
    sachant que le code est :
    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;
     
    my $fichier_bam = 'TE_clip19_0mm.bam';
    my %comptage;
    open my $fh, '<', $fichier_bam or die "Impossible de lire le fichier $fichier_bam\n";
    while ( my $ligne = <$fh> ) {
    	chomp $ligne;
    	my ($ID,undef,$ET) = split /\t/, $ligne;
    	$comptage{$ID}->{'count'} = $comptage{$ID}->{'count'}+ 1;
    	push(@{$comptage{$ID}->{'data'}}, $ET);
    }
    close $fh;
    foreach my $ID (keys(%comptage)) {
    	if ($comptage{$ID}->{'count'} == 1)
    	{
    		print("ID=$ID\tET=".join("\t", @{$comptage{$ID}->{'data'}})."\n");
    	}
    }
    Pour etre sure d'avoir bien compris : vous créez un hash de hash de cette forme :
    {comptage}{ID}{ 'count' :
    'data' :
    }
    où :
    sera la clé, donc unique pour chaque identifiant, et à chaque fois qu'on rencontrera un $ET différent, sera incrémenté grâce à la ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $comptage{$ID}->{'count'} = $comptage{$ID}->{'count'} + 1;
    ?
    Je ne comprends pas bien comment le fait que $ET est different d'une ligne à l'autre est pris en compte dans votre code ?

  6. #6
    Membre averti Avatar de zanker
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut
    L'erreur rencontrée est un problème de variable non initialisé. C'est à dire que dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $comptage{$ID}->{'count'} = $comptage{$ID}->{'count'} + 1;
    la variable "$comptage{$ID}->{'count'}" n'a pas de valeur (elle doit valoir undef).

    En corrigeant mon code ce devrait fonctionner comme ça :
    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
    my $fichier_bam = 'TE_clip18_0mm.bam';
    my %comptage;
    open my $fh, '<', $fichier_bam or die "Impossible de lire le fichier $fichier_bed\n";
    while ( my $ligne = <$fh> ) {
    	chomp $ligne;
    	my ($ID,undef,$ET) = split /\t/, $ligne;
    	if (exists($comptage{$ID}->{'count'}))
    	{
    		$comptage{$ID}->{'count'} = $comptage{$ID}->{'count'} + 1;
    	}
    	else
    	{
    		$comptage{$ID}->{'count'} = 1;
    	}
    	push(@{$comptage{$ID}->{'data'}}, $ET);
    }
    close $fh;
    foreach my $ID (keys(%comptage)) {
    	if ($comptage{$ID}->{'count'} == 1)
    	{
    		print("ID=$ID\tET=".join("\t", @{$comptage{$ID}->{'data'}})."\n");
    	}
    }
    Pour expliquer 'visuellement' la table de hashage "%comptage", il y a les hash classiques comme celui-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    %hash = {
    	'clé n°1' => 'Valeur A',
    	'clé n°2' => 'Valeur B'
    	...
    }
    et il y a le notre, dans cet exemple qui vaut 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
     
    %comptage= {
    	'TTTA_1' => {
    		'count' => 2,
    		'data' => ( 'TABOR_I', 'HELENA_RT')
    	},
    	'GGGA_1' => {
    		'count' => 1,
    		'data' => ( 'TABOR_I' )
    	},
    	'AGCC_1' => {
    		'count' => 2,
    		'data' => ( 'GYPSY_I', 'TABOR_I' )
    	},
    	'TACC_3610' => {
    		'count' => 1,
    		'data' => ( 'HELENA_RT' )
    	}
    }
    Pour chaque clé du hash, qui est un ID, correspond une valeur qui est égale à une référence d'un autre hash.
    Cette autre hash contient 2 clés 'count' et 'data'.
    Et pour la clé 'data' correspond une valeur qui est une référence à un tableau/une liste contenant les $ED à retenir.

    La ligne de code suivante affiche toutes les valeurs $ED mis en mémoire dans le hash %comptage de chaque $ID (grâce à la boucle sur les $ID) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("ID=$ID\tET=".join("\t", @{$comptage{$ID}->{'data'}})."\n");
    ________________________________________________________________________

    Maintenant, avec du recule, il est possible de simplifier ce code 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
    my $fichier_bam = 'TE_clip18_0mm.bam';
    my %comptage;
    open my $fh, '<', $fichier_bam or die "Impossible de lire le fichier $fichier_bed\n";
    while ( my $ligne = <$fh> ) {
    	chomp $ligne;
    	my ($ID) = split /\t/, $ligne;
    	push(@{$comptage{$ID}}, $ligne);
    }
    close $fh;
    foreach my $ID (keys(%comptage)) {
    	if (scalar(@{$comptage{$ID}}) == 1)
    	{
    		print($comptage{$ID}->[0]."\n");
    	}
    }
    ici $comptage{$ID} pointe vers une variable de type tableau/liste.
    Donc la première valeur de cette liste est récupérée avec $comptage{$ID}->[0]
    Maintenant, le hash %comptage vaut ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    %comptage= {
    	'TTTA_1' => ( 'TTTA_1	+	TABOR_I	6122	AAAA....IIIIIIII	0',
    		'TTTA_1	+	HELENA_RT	909	ATCACCC....IIIIIIII	0')
    	},
    	'GGGA_1' => ( 'GGGA_1	+	TABOR_I	6122	AAAAAA....IIIIIII	0' )
    	},
    	'AGCC_1' => ( 'AGCC_1	+	GYPSY_I	6121	GAAAAAAA....IIIIIII	0',
    		'AGCC_1	+	TABOR_I	6121	GAAAA....IIIIIIII	0' )
    	},
    	'TACC_3610' => ( 'TACC_3610	+	HELENA_RT	909	ATCACC....IIIIII	0' )
    	}
    }

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    Merci pour ton aide et toutes les explications !

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

Discussions similaires

  1. Parcours d'un hash de hash de hash
    Par ngere dans le forum Langage
    Réponses: 5
    Dernier message: 06/07/2005, 09h53
  2. Réponses: 6
    Dernier message: 05/07/2005, 11h05
  3. Réponses: 2
    Dernier message: 09/03/2005, 14h35
  4. [langage] hash de hash
    Par Kinethe dans le forum Langage
    Réponses: 17
    Dernier message: 27/08/2004, 13h22
  5. [langage] probleme avec un hash de hash
    Par planetevoyage dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2003, 12h55

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