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

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 9
    Points : 7
    Points
    7
    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 : 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
    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é.
    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 Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    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 : 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 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.
    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. 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