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

Contribuez Perl Discussion :

Ajouter des éléments dans un hash de hash pré-existant sans rien supprimer


Sujet :

Contribuez Perl

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 14
    Points : 17
    Points
    17
    Par défaut Ajouter des éléments dans un hash de hash pré-existant sans rien supprimer
    Bonjour à tous et à toutes
    Après avoir passé 3 jours sur le net pour essayer de répondre à ma question, je viens vers vous dans l'espoir de trouver une solution à mon problème...
    Alors voilà, je suis encore un peu novice dans le langage PERL et j'ai encore du mal à manipuler les tables de hash de hash.
    Au départ j'ai 2 fichiers .tsv; je crée une table de hash pour récupérer les éléments de mon premier fichier. Mon 2e fichier comporte les clés de mon hash.
    Je veux ajouter/enrichir mon hash d'informations supplémentaires que comporte mon 2e fichier grâce aux clés (de premier niveau).


    exemple :

    Fichier1.tsv

    identifiant1 courir parc
    identifiant2 marcher montagne
    ...


    Fichier2.tsv

    identifiant1 chaussures baskets bleus marqueA
    identifiant1 haut débardeur jaune marqueB
    identifiant2 chaussures chaussures de randonnées marron marqueC
    identifiant2 bas short orange marqueD


    Ce que j'aimerai :

    Si je fais un print pour avoir mon hash de départ après avoir parcouru Fichier1.tsv:

    %hash = (
    identifiant1 => {
    fonction => 'courir',
    lieu => 'parc'
    }
    identifiant2 => {
    fonction => 'marcher',
    lieu => 'montagne'
    }
    ...
    );



    si je fais un print de mon hash après lecture du Fichier2.tsv:
    %hash = (
    identifiant1 => {
    'fonction' => courir,
    'lieu' => parc,
    'habits' => {
    chaussures => {
    'type' => baskets,
    'couleur' => bleus,
    'marque' => marqueA
    }
    haut => {
    'type' => débardeur,
    'couleur' => jaune,
    'marque' => marqueB
    }
    }
    identifiant2 => {
    'fonction' => marcher,
    'lieu' => montagne,
    'habits' => {
    chaussures => {
    'type' => chaussures de montagne,
    'couleur' => marrons,
    'marque' => marqueC
    }
    bas => {
    'type' => short,
    'couleur' => orange,
    'marque' => marqueD
    }
    }
    );


    Voici mon code :

    #!/usr/bin/perl -w

    # Usage : ./enriched_hash.pl fichier1.tsv fichier2.tsv


    use Data:: Dumper qw(Dumper);


    $GU = $ARGV[0];
    $inter = $ARGV[1];


    my %hash;

    open FICHIER1, $GU;

    while(<FICHIER1>) {
    chomp;

    @ligne = split(/\t/, $_);


    $hash{$ligne[0]}{'fonction'} = $ligne[1];
    $hash{$ligne[0]}{'lieu'} = $ligne[2];

    }

    close FICHIER1;


    print Dumper \%hash;
    print "____________________\n";


    open FICHIER2, $inter;

    while(<FICHIER2>) {
    chomp;

    @line = split(/\t/, $_);

    $hash{$line[0]}{'habits'}{$line[1]}{'type'} = $line[2];
    $hash{$line[0]}{'habits'}{$line[1]}{'couleur'} = $line[3];
    $hash{$line[0]}{'habits'}{$line[1]}{'marque'} = $line[4];

    }

    close FICHIER2;


    print Dumper \%hash;
    print "____________________\n";



    Le problème étant : que mon hash de hash n'a plus du tout les fonctions et le lieu du premier niveau.

    Comment dois-je faire pour obtenir ce que je veux?

    Edit: j'ai retiré le préfixe "Perl 6" de l'intitulé de ton post car il ne concerne manifestement pas Perl 6 (mais Perl 5). Cordialement. Lolo78.

  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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    peux-tu montrer ce que tu obtiens (sortie Data Dumper) avec ton programme actuel?

  3. #3
    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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    voici un exemple qui fait, me semble-t-il, à peu près ce que tu désires:
    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
     
    use strict;
    use warnings;
    use Data::Dumper;
     
    my $fic1 = 
    'identifiant1 courir parc
    identifiant2 marcher montagne';
    my %hash;
     
    open my $FIC1, "<", \$fic1 or die "Ouverture impossible de $fic1 $!";
    while (my $line = <$FIC1>) {
    	chomp $line;
    	my ($id, $activity, $place) = split /\s/, $line;
    	$hash{$id} = { fonction => $activity, lieu => $place };
    }
     
    print Dumper \%hash;
    print "==================\n";
     
    while (my $line = <DATA>) {
    	chomp $line;
    	my ($id, $vetement, $type, $color, $marque) = split /\t/, $line;
    	$hash{$id}{$vetement} = { type => $type, couleur => $color, marque => $marque };
    }
     
    print Dumper \%hash;
     
     
     
    __DATA__
    identifiant1	chaussures	baskets	bleus	marqueA
    identifiant1	haut	débardeur	jaune	marqueB
    identifiant2	chaussures	chaussures de randonnées	marron	marqueC
    identifiant2	bas	short	orange	marqueD
    Voici l'affichage obtenu:

    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
    $ perl HoH.pl
    $VAR1 = {
              'identifiant2' => {
                                  'fonction' => 'marcher',
                                  'lieu' => 'montagne'
                                },
              'identifiant1' => {
                                  'fonction' => 'courir',
                                  'lieu' => 'parc'
                                }
            };
    ==================
    $VAR1 = {
              'identifiant2' => {
                                  'fonction' => 'marcher',
                                  'lieu' => 'montagne',
                                  'chaussures' => {
                                                    'marque' => 'marqueC',
                                                    'type' => 'chaussures de randonnées',
                                                    'couleur' => 'marron'
                                                  },
                                  'bas' => {
                                             'marque' => 'marqueD',
                                             'type' => 'short',
                                             'couleur' => 'orange'
                                           }
                                },
              'identifiant1' => {
                                  'fonction' => 'courir',
                                  'lieu' => 'parc',
                                  'chaussures' => {
                                                    'marque' => 'marqueA',
                                                    'type' => 'baskets',
                                                    'couleur' => 'bleus'
                                                  },
                                  'haut' => {
                                              'marque' => 'marqueB',
                                              'type' => 'débardeur',
                                              'couleur' => 'jaune'
                                            }
                                }
            };

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 14
    Points : 17
    Points
    17
    Par défaut
    En fait c'est un exemple que j'avais fait mais apparemment avec le code que j'ai écrit sur ce forum ça fonctionne. Pourtant avec les données que j'ai ça ne marche pas aussi bien.

    J'ai regardé ce que tu as fait et c'est plus ou moins ce que j'avais fait mais tu l'as clairement mieux organiser que moi

    Finalement, j'ai réussi à trouver un moyen pour que mes clés (de 1er niveau) ne soient pas supprimer lorsque j'appelle ma table de hashage avec ce type de clés avec le 2e fichier.
    J'utilise tout simplement le référencement.

    En clair, j'ai fait

    $ref = \%hash

    if (exists $$ref{$ligne[0]}) {
    ...instructions...
    }

    En fait $$ref est la même chose que %hash


    Merci en tout cas pour tes réponses aussi rapides et ton code

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

Discussions similaires

  1. Ajouter des éléments dans Vector à 2D
    Par mimish dans le forum C++
    Réponses: 0
    Dernier message: 15/03/2011, 17h42
  2. Réponses: 3
    Dernier message: 25/01/2009, 17h32
  3. Ajouter des éléments dans un champ text
    Par gtraxx dans le forum jQuery
    Réponses: 14
    Dernier message: 08/01/2009, 15h22
  4. Ajouter des éléments dans une base de données Access
    Par bidule123456 dans le forum ASP
    Réponses: 74
    Dernier message: 07/09/2007, 14h00
  5. Ajout des éléments dans un tableau de structure
    Par rphenix dans le forum WinDev
    Réponses: 10
    Dernier message: 22/06/2007, 11h34

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