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 :

Somme de differentes lignes égales


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 58
    Points : 35
    Points
    35
    Par défaut Somme de differentes lignes égales
    Bonjour,

    J ai un fichier avec des personnes et un capital. Comme ceci:

    Pol 256
    gregory 365
    michel 152
    pol 152
    francois 65
    christophe 654
    michel 56

    Je voudrais faire un script que va me retourner Ceci : le nom des personnes avec la somme de leur capital.

    Pol (256+152)
    gregory 365
    michel (152+56)
    francois 65
    christophe 654


    Merci,


    Mimiche

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par Mimiche Voir le message
    Bonjour,

    J ai un fichier avec des personnes et un capital. Comme ceci:

    Pol 256
    gregory 365
    michel 152
    pol 152
    francois 65
    christophe 654
    michel 56

    Je voudrais faire un script que va me retourner Ceci : le nom des personnes avec la somme de leur capital.

    Pol (256+152)
    gregory 365
    michel (152+56)
    francois 65
    christophe 654


    Merci,


    Mimiche
    Bonjour,

    peux-tu nous montrer le code que tu as fait stp ?

    Si pas déjà commencé, pour t'aiguiller sur une manière (parmi d'autres) de procéder :

    - en supposant qu'une ligne contienne 2 valeurs (nom, capital) séparées par une tabulation, tu splittes chaque ligne ce qui te permet d'avoir le nom et le capital bien distincts
    - je te suggère de mettre le nom en minuscule car Perl est sensible à la casse
    - tu te concocte un hash de listes. la clé = le nom (voilà pourquoi mieux vaut que tous tes noms soient en minuscules), la liste contenant tous les capitaux trouvés pour ce nom

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 58
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    En fait mon script est plus compliqué que cela. Je ai pris un exemple avec des personens et un capital pour que ca ne soit pas trop difficil a expliquer.

    En réalité, mon script doit me permettre de faire cela avec des machines et des groupes.

    J ai en entrée : (enregistré en CSV)

    machine1;community;groupe1
    machine2;community;groupe2
    machine1;community;groupe3
    machine2;community;groupe2
    machine2;community;groupe3

    Mon script va compter les port ethernet et up de la machine qui correspond au groupe.

    Avec le script que j'ai, j'ai en sortie :

    groupe1 Nombre total de port :... Port ethernet ... ethernet up...
    groupe2 Nombre total de port :... Port ethernet ... ethernet up...
    groupe3 Nombre total de port :... Port ethernet ... ethernet up...
    groupe2 Nombre total de port :... Port ethernet ... ethernet up...
    groupe3 Nombre total de port :... Port ethernet ... ethernet up...

    J aimerai qu'il me fasse la somme des ports des meme groupe. Pour le groupe 2 et 3, qu'il me fasse la somme des ports.

    Est ce que je uis assez clair ?

    Voici mon code :


    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    use strict;
    use Data::Dumper;
     
    BEGIN {
    	unshift @INC, '/PRD/SYDN/perl-lib';
    };
     
    use Net::SNMP;
     
     
    my %ifCount;
    my @device=($_);
    my $device;
    my $ligne;
    my %Count;
     
     
     
    open FICHIER,"<input.csv " or die "le fichier n existe pas";
     
     
    while ($ligne = <FICHIER>){
    chomp ($ligne);
     
    my $machine;
    my $community;
    my $groupe;
     
     
     
    	foreach($ligne) {
    	%ifCount=0;
    	($machine,$community,$groupe) = split (/;/,$ligne);
     
     
     
    my ($session, $error) = Net::SNMP->session(
    			      -version     => 'snmpv2c',
    			      -hostname    => $machine,
    			      -community   => 'nVNmgAix',
    			      -port        =>  161 ,
    			      -timeout=> 1
     
    			   );
     
    	if ($error) {print $error; exit}
     
     
    my $ifIndex                     = $session->get_table(  -baseoid => "1.3.6.1.2.1.2.2.1.1" );
    my $ifType			= $session->get_table(	-baseoid => "1.3.6.1.2.1.2.2.1.3" );
    my $ifLabel			= $session->get_table(	-baseoid => "1.3.6.1.2.1.31.1.1.1.1" );
    my $ifOperStatus		= $session->get_table(	-baseoid => "1.3.6.1.2.1.2.2.1.8" );
     
     
    foreach  my $nbport (values %$ifIndex) {
     
     
     
                      $ifCount{$device[0]}{glob}++;
    		  next unless $$ifType{'1.3.6.1.2.1.2.2.1.3.'.$nbport} == 6; 
        		  $ifCount{$device[0]}{total}++;
                      $ifCount{$device[0]}{up}++   if $$ifOperStatus{'1.3.6.1.2.1.2.2.1.8.'.$nbport} == 1 ;
    }		
     
     
     
    print     	      "Groupe: $groupe\t".
    		      "Nombre total de ports:$ifCount{$device[0]}{glob}\t".
    		      "Nombre ports Ethernet:$ifCount{$device[0]}{total}\t".
    		      "Port Ethernet UP:$ifCount{$device[0]}{up}\n";
     
    }
     
    }
     
     
    close FICHIER;






    Merci,


    Mimiche

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    veuillez mettre votre code sous balise code, c'est illisible (c'est le #).

    Merci

  5. #5
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 58
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    Personne ne peut m aider ? En fait, je dois faire l addition des ports des machine qui ont le meme groupe. Si une machineA et une machineB ont le meme groupe, alors on va faire la somme des ports des 2 machines.

    Merci,

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 58
    Points : 35
    Points
    35
    Par défaut
    Personne ne peut m aider ? Ou vous ne comprenez pas mon problème ?

    Merci,

  7. #7
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Ben, faut dire que tu n'es pas super clair. Perso, je ne vois pas du tout comment tu trouves tes infos dans ton fichier en entrée.
    machine1;community;groupe1
    machine2;community;groupe2
    machine1;community;groupe3
    machine2;community;groupe2
    machine2;community;groupe3
    Je ne vois pas comment tu récupère un nombre de ports Ethernet ou up à partir de ça (vu notemment qu'il n'y a aucun type de port mentionné dans ton fichier). Le type de problème que tu avais décrit au départ n'est effectivement pas très compliqué à résoudre en Perl, mais là, je ne comprends rien à ton problème particulier.
    There's nothing like $HOME!

  8. #8
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 58
    Points : 35
    Points
    35
    Par défaut
    En fait, le fichier en entrée on me le donne... J y accéde comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open FICHIER,"<input.csv " or die "le fichier n existe pas";
    J arrive a accéder au machine gràce à : Le code que j ai fait fonctionne. Pour chaque ligne , je fais un split qui va me permettre de trouver les groupe et les machines dans mon fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ($machine,$community,$groupe) = split (/;/,$ligne);
    Je trouve l'état des ports grace à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach  my $nbport (values %$ifIndex) {
     
     
     
                      $ifCount{$device[0]}{glob}++;
    		  next unless $$ifType{'1.3.6.1.2.1.2.2.1.3.'.$nbport} == 6; 
        		  $ifCount{$device[0]}{total}++;
                      $ifCount{$device[0]}{up}++   if $$ifOperStatus{'1.3.6.1.2.1.2.2.1.8.'.$nbport} == 1 ;
    }
    Le numéro 6 étant le port ethernet, il ne me retourne que les ports ethernet.

    Voici ce que mon code me donne en sortie:

    Groupe: agence Nombre ports total:576 Nombre ports Ethernet:546 Ethernet UP:247 Ethernet DOWN:299
    Groupe: agence Nombre ports total:576 Nombre ports Ethernet:546 Ethernet UP:247 Ethernet DOWN:299
    Groupe: LAN Nombre ports total:34 Nombre ports Ethernet:2 Ethernet UP: Ethernet DOWN:2
    Groupe: WAN Nombre ports total:34 Nombre ports Ethernet:2 Ethernet UP: Ethernet DOWN:2
    Groupe: WAN Nombre ports total:576 Nombre ports Ethernet:546 Ethernet UP:247 Ethernet DOWN:299



    Merci,

  9. #9
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    OK, c'est déjà plus clair, là. C'est plus facile de bosser quand on sait sur quelles données on travaille.
    Bon, c'est pas très compliqué en fait. Il suffit d'extraire de tes lignes les informations pertinentes, ce qui se fait très facilement avec une regex, puis de les traiter dans un hachage.

    Mettons que tes données sont dans un tableau @lignes (tu trouveras peut-être un moyen de ne pas passer par ce stade, mais ça ne change pas grand'chose à l'explication présente). On peut, par exemple, procéder comme suit :
    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
     
    #le hachage qui va contenir les infos
    my %sommes;
    foreach (@lignes)
    {
    #extraction du nom du groupe et des nombres de ports qui t'intéressent
    #c'est à dire les trois premiers nombres de la ligne
    #on utilise une regex en contexte de liste, sur la variable par défaut, $_, implicite.
        my ($groupe,@nombres)=m/Groupe: (\w+)\D*(\d+)\D*(\d+)\D*(\d+)/ ;
    #on initialise le champ correspondant au groupe s'il n'existe pas encore.
    #on va en faire une référence à un tableau anonyme.
        $sommes{$groupe}=[0,0,0] unless (exists $sommes{$groupe});
     
    #et à chacun des éléments du tableau, on ajoute l'élément correspondant de @nombres
        $sommes{$groupe}->[$_]+= $nombres[$_] for (0..2);
    }
    #pour afficher le tout
    foreach my $groupe (keys %sommes)
    {
    #on déréférence le tableau dans des variables aux noms explicites
        my ($total,$ethernet,$up)=@{$sommes{$groupe}};
        print "Ports du groupe $groupe\n";
        print "\tTotal : $total\n";
        print "\tdont Ethernet : $ethernet\n";
        print "\tdont UP : $up";
    }
    Voilou. C'est pas optimal, en particulier la façon dont j'ai géré les sommes ne me satisfait pas des masses, il doit y avoir plus clean, j'imagine. Mais ça marche. Si tu as des questions...

    EDIT: ah non, flûte, je viens de remarquer que ça ne marche pas bien, vu que dans tes données, quand une catégorie de ports n'a pas d'éléments, il n'y a rien, au lieu d'y avoir un zéro. Du coup il faudrait changer la regex. J'ai un peu la flemme pour le moment.

    EDIT 2: bon, en fait, je me suis embêté pour rien, c'est beaucoup plus simple que ça, je viens de le réaliser en comprenant enfin ton code (soit dit en passant, tu devrais travailler un peu tes indentations, elles sont totalement incohérentes).
    J'ai remarqué que tu déclares un hachage %Count en début de script, qui n'est utilisé nulle part. Je ne sais pas si c'est à ça que tu le destinais (son nom le suggère), mais je l'ai utilisé dans le code qui va suivre, que tu pourras mettre juste avant, juste après ou carrément à la place de ton print, c'est toi qui voit. Voici les deux lignes qu'il te faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $Count{$groupe}={} unless (exists $Count{$groupe});
    $Count{$groupe}{$_}+=$ifCount{$device[0]}{$_} foreach(keys %{$ifCount{$device[0]}});
    Et voilà tout. Au terme de ta boucle, le hachage %Count, dont les clés sont des noms de groupes, a pour valeurs des références à des hachages dont les clés sont tes catégories de ports, et les valeurs les cardinaux de ces catégories pour le groupe considéré.
    There's nothing like $HOME!

Discussions similaires

  1. Somme sur une ligne
    Par Korleone dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 13/02/2008, 11h45
  2. [FAQ VBA Excel] Somme d'une ligne d'un tableau sur un classeur fermé
    Par nox1492 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/12/2007, 12h54
  3. [VBA-E] : somme de deux lignes ayant des positions variables
    Par johnmakina dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 23/01/2007, 16h47
  4. [Trigger] Somme de différentes lignes
    Par outlawz dans le forum Oracle
    Réponses: 5
    Dernier message: 08/09/2006, 16h32
  5. somme sur plusieurs lignes d'un dbgrid
    Par pierrot67 dans le forum Bases de données
    Réponses: 11
    Dernier message: 11/07/2006, 10h24

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