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 :

Lecture 2 premieres lignes, calcul valeurs doublons


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Décembre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 9
    Par défaut Lecture 2 premieres lignes, calcul valeurs doublons
    Bonjour,

    voilà mon problème, je dois lire dans un fichier 2 lignes:
    la première ressemble à ça:
    ABC123|ABC456|DEF987|DEF654|DEF321...
    La 2 eme ligne correspond aux valeurs de la 1 e ligne:
    10|2|54|65|12

    je dois regrouper les noms de la premiere ligne si les 3 premieres lettres sont identiques, (ABC: ABC123, ABC456 et DEF: DEF987, DEF654, DEF321), ABC devra contenir le total des ABC soit ABC=10+2=12 idem pour DEF, DEF=54+65+12=131.

    Je ne sais absolument pas comment procéder (je débute en Perl). Pouvez vous m'aidez ?

    Merci

  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 : 59
    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
    Par défaut
    Une idée comme çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    my %groupe = (); # pour sauver les groupes (les clés seront ABC, DEF, ...)
    my @ligne1 = split /\|/, <STDIN>;
    my @ligne2 = split /\|/, <STDIN>;
     
    foreach my $index (0 .. $#ligne1) {
      # On extrait le groupe de la ligne 1
      my ($groupe_name) = $ligne1[$index] =~ /^([A-Z+)/i;
      # On ajoute dans ce groupe, la valeur correspondante de la ligne2
      $groupe{$groupe_name} += $ligne2[$index];
    }
    Je rapidement testé sur l'exemple donné.

  3. #3
    Membre très actif Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Par défaut
    Un débutant passe et s'écrit : "Super le perl ! Il est capable de comprendre que si "ABC" existe déjà faut mettre à la suite et pas crée une erreur genre : "indice déjà existant" ?
    Le débutant regarde alors son code : "si l'indice existe déjà dans le tableau alors écrire à la suite, sinon le crée et..." Met un coup sélectionneur dessus et appuie sur Delete. Allez on reprend avec des listes

  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 : 59
    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
    Par défaut
    Attention cependant, car le mécanisme d'autovivification a des effets pervers qu'il faut connaitre, et dont les effets de bord peuvent avoir des répercussions inattendues.

    Si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %mon_hash = ();
    if (exists $mon_hash{cle1}->{sous_cle1}) {
      # cle1 est autovivifié
    }
     
    use Data::Dumper;
    print Data::Dumper->Dumper([\%mon_hash], [qw(*mon_hash)]);
    j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    %mon_hash = (
                  'cle1' => {
                              'sous_cle1' => 1
                            }
                );
    La clé cle1 est créée et renvoie sur une référence de hash vide.

    Edit : j'ai changé l'exemple pour un cas plus révélateur du problème lié à l'autovivification.

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/05/2012, 20h41
  2. Réponses: 1
    Dernier message: 09/02/2012, 18h30
  3. Réponses: 4
    Dernier message: 27/11/2008, 10h36
  4. recuperer premiere ligne des doublons
    Par sounine dans le forum SQL
    Réponses: 14
    Dernier message: 28/03/2008, 12h03
  5. Lecture de la premiere ligne d'un fichier
    Par ze veritable farf dans le forum C
    Réponses: 19
    Dernier message: 31/10/2006, 14h17

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