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 :

Associer contenu de plusieurs lignes à une clé.


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 58
    Par défaut Associer contenu de plusieurs lignes à une clé.
    Bonjour,

    J ai réalisé un script qui qui va parcouri un fichier csv (qu'on me donne) et qui va pour chaque ligne de ce fichier CSV compter les ports de machine qui sont dans ce fichier csv.Il y a une machine par ligne.

    Si j ai 5 ligne dans le CSV, il va me retourner les ports pour les 5 machines. J aimerais bien que quand une machine se retrouve sur plusieurs lignes, il fasse la somme des ports.

    Voici le 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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    use strict;
    use Data::Dumper;
     
    BEGIN {
    	unshift @INC, '/PRD/SYDN/perl-lib';
    };
     
    use Net::SNMP;
     
    my %ifCount;
    my $ifCount;
    my $ligne;
    my $tot;
    my $up;
    my $ethernet;
    my %Count;
    my $Count;
    my $groupe;
     
     
     
     
    open FICHIER,"<input.csv " or die "le fichier n existe pas";
     
    while ($ligne = <FICHIER>){
    	chomp ($ligne);
     
    		my $machine;
    		my $community;
     
     
    		%Count=0;
     
    		($machine,$community,$groupe) = split (/;/,$ligne);
     
     
    		my ($session, $error) = Net::SNMP->session(
    			      -version     => 'snmpv2c',
    			      -hostname    => $machine,
    			      -community   => $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 $ifOperStatus		= $session->get_table(	-baseoid => "1.3.6.1.2.1.2.2.1.8" );
     
     
    		#On va compter les porte totale, ethernet et ethernet UP
     
     
    	foreach  my $C (values %$ifIndex){
     
     
    		  $Count{glob}++;
    		  next unless $$ifType{'1.3.6.1.2.1.2.2.1.3.'.$C} == 6; 
        		  $Count{Ethernet_tot}++;
                      $Count{up}++   if $$ifOperStatus{'1.3.6.1.2.1.2.2.1.8.'.$C} == 1 ;
     
    		#on pourrait les mettres dans $tot $up $etherup
     
    		  $tot = $Count{glob};
    		  $up  = $Count{up};
    		  $ethernet = $Count{Ethernet_tot};
     
    		#Afficher 0 quand il n'y a pas de port UP
     
    	if ($up == 0) 
    		{$up ="0";}
     
    				}
     
    		#on va stocker le résultats dans ifCount.
     
    			 $ifCount{$groupe}{tot}= $tot;
    		  	 $ifCount{$groupe}{up}= $up;
    		  	 $ifCount{$groupe}{ethernet}= $ethernet;
     
     
    		print 	"$groupe \t".
    			"Port tot:$tot  \t". 
    			"Ethernet:$ethernet  \t".
    			"Ethernet up:$up  \n";
     
    	}
     
     
    		print Dumper( \%ifCount);	
     
    close FICHIER;

    Merci,

    Mimiche

  2. #2
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 58
    Par défaut
    Bonjour,


    Personne ne peut m aider ? Vous ne comprenez pas mon problème ?

    Merci,

  3. #3
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Bonjour,

    Non, ce n'est pas clair ^^ enfin, pour moi peut-être que pour les plus doués ça l'est mais vu qu'ils ne semblent pas disponibles tu peux toujours essayer de m'expliquer. Pourrais-tu montrer quelques lignes de ce fichier en exemple?

    machine1;community1;groupe1
    machine2;community2;groupe2
    machine3;community3;groupe3


    ... et tu veux que quand on retrouve plusieurs fois la même machine on additionne les ports ... pourrais-tu expliquer exactement ce que tu entends par là car je n'y connais rien en réseau et hardware (je sais seulement ce qu'est un port) ... où récupère t'on les valeurs de ces ports? Qu'entends tu par en faire la somme? Je voudrais bien t'aider mais il faudrait m'expliquer un peu plus.


    Voila comment je ferais:
    Je créerais une hast contenant en clé le nom de la machine et en valeur la somme de ses ports.
    Tu récupères le nouveau couple $machine, $port
    Tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (exists $hash{$machine})
    {
            $hash{$machine} += $port;
     
    }
    else
    {
            $hash{$machine} = $port;
    }




    Jasmine,

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 58
    Par défaut
    Bonjour,

    En fait, ce n'est pas un problème de réseau, le ports je les résupère très bien.
    J'ai tous les port de chaque ligne.

    En fait, dans le script que j ai fait, je mets mes valeurs dans un hash à l aide de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                                  $ifCount{$groupe}{tot}= $tot;
    		  	 $ifCount{$groupe}{up}= $up;
    		  	 $ifCount{$groupe}{ethernet}= $ethernet;
    $tot = nombre de port total
    $up = nombre de prot UP
    $ethernet = nombre de port ethernet.

    Avant cela, je fais une boucle qui parcour mon fichier csv ligne par ligne et qui me retourne les ports de chaque machine ligne par ligne.

    Le script me retourne pour le moment les port ligne par ligne, j aimerais bien que si par exemple la machine de la ligne 1 et le meme que la machine de la ligne 3, il m additionne ces port dans le hash.

    fichier csv :

    machine1;groupe1
    machine2;groupe2
    machine3;groupe1
    machine1;groupe3
    machine2;groupe2

    J ai en sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $var1 = { "groupe1" => {  'tot' =>576,
                                                 'up' =>54,
                                                 'ethernet' =>652, }
     
                           "groupe2" => {  'tot' =>654,
                                                 'up' =>25,
                                                 'ethernet' =>354, }
     
     
                          "groupe3" => {  'tot' =>125,
                                                'up' =>62,
                                                'ethernet' =>110, }
    }

    problème que je rencontre :

    Mon script me retrouve bien tout les groupe différents. J aimerais que pour le groupe1, il additionne les port de la ligne 1 et de la ligne 3 et que pour le groupe2 il additionne les ports de la ligne2 et 5. Dans mon script, il affiche a mon avis les port de la dernière ligne qu'il rencontre. Je ne sais pas comment lui dire que quand il rencontre le meme groupe, il additionne les port a ceux kil a déjà.

    Est ce que c'est plus clair ?


    Merci,

    Mimiche

  5. #5
    Membre chevronné
    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
    Par défaut
    Je suis intrigué, quel est exactement le souci avec la solution que je t'ai donnée ? Elle ne marche pas ? Je n'ai pas été clair ? Ç'aurait peut-être été plus simple pour tout le monde si tu avais continué la discussion là bas au lieu de lancer ton troisième sujet sur le même problème.

  6. #6
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 58
    Par défaut
    Bonjour,

    Oui, dsl d avoir ouvert une nouvelle discution. En fait j ai changé un peu mon code parceque il n'était pas clair avant...

    Maintenant j ai fais une boucle comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (exists $ifCount{$groupe}) {
     
          $ifCount{$groupe}{tot} +=  $ifCount{$groupe}{tot};
          $ifCount{$groupe}{up}  +=  $ifCount{$groupe}{up};
          $ifCount{$groupe}{ethernet} += $ifCount{$groupe}{ethernet} ;}
     
    else {$ifCount {$groupe} ++;}
    Cette boucle ne marche pas, elle multiplie tt les ports par 2. Ce que je veux lui dire, c'est que quand le groupe exist, il additionne au groupe qui existe autrement il crée une nouvelle clé avec un nouveau groupe dans le hash.


    Merci,

  7. #7
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    je te suggère de nous donner un exemple de ton fichier (quelques lignes) et de nous donner un exemple de resultats que tu souhaites, car sincéremment ce n'est pas clair et c'est fatiguant de se prendre la tête à deviner ce que tu veux concrétement,

    Voilà (si tu souhaite avoir de l'aide biensûr).

  8. #8
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 58
    Par défaut
    Voici une partie du fichier CSV :

    Nous avons la machine ; la communauté ; le groupe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    Swbdt06ac1.dexlan.be;nVNmgAix;agence
    Swbdt06ac1.dexlan.be;nVNmgAix;agence
    A108407.bb.dexnet.be;nVNmgAix;LAN
    A108407.bb.dexnet.be;nVNmgAix;WAN
    Swbdt06ac1.dexlan.be;nVNmgAix;WAN
    A108407.bb.dexnet.be;nVNmgAix;agence
    Swbdt06ac1.dexlan.be;nVNmgAix;test
    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
     
     
    Pour le moment mon script me donne cela :
     
    agence  Port tot:576    Ethernet:546    Ethernet up:270
    agence  Port tot:576    Ethernet:546    Ethernet up:270
    LAN     Port tot:32     Ethernet:2      Ethernet up:0
    WAN     Port tot:32     Ethernet:2      Ethernet up:0
    WAN     Port tot:576    Ethernet:546    Ethernet up:270
    agence  Port tot:32     Ethernet:2      Ethernet up:0
    test    Port tot:576    Ethernet:546    Ethernet up:270
     
     
    $VAR1 = {
              'test' => {
                          'tot' => 576,
                          'ethernet' => 546,
                          'up' => 270
                        },
              'WAN' => {
                         'tot' => 576,
                         'ethernet' => 546,
                         'up' => 270
                       },
              'agence' => {
                            'tot' => 32,
                            'ethernet' => 2,
                            'up' => '0'
                          },
              'LAN' => {
                         'tot' => 32,
                         'ethernet' => 2,
                         'up' => '0'
                       }
            };
    Au début il me donne le nombre de ports des machine de chaques lignes. Ca c'est ok. Ensuite, dans mon hash il me trouve bien tous les groupe différents. (ici nous avons 4 groupes différents) mais la valeurs des ports n'est pas bonne. J aimerais qu'il m additionne tous les ports pour les groupe qui revienne plusieur fois. Par exemple pour agence cela devrait ressembler a cela:

    'agence' => {
    'tot' => 576+576+32,
    'ethernet' => 546+546+2,
    'up' => 270+270+0, }

    Est ce que c'est plus clair ?

    Merci,

  9. #9
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    ouf, c déjà plus clair
    donc maintenant remonte nous comment tu crées ton hash, car de ce que je comprends, tu dois mettre en cle les noms de tes groupes, mais tu ne dois pas faire de test d'existence de la clé et du coup, tu l'ecrases au fur et à mesure;
    C'est pour ça que pour agence, tu n'a que la derniere ligne de ton fichier de lu

  10. #10
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 58
    Par défaut
    OK, tant mieux alors.

    On y arrive... J espère que vous allez pouvoir m aider pcq je suis en stage et j aimerais bien arriver a faire cela le plus vite possible...


    OUi je sais que c'est au niveau de la création du hash qu'il y a un problème.

    Je crée mon hash comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ifCount{$groupe}{tot}= $tot; 
    		  	$ifCount{$groupe}{up}= $up;
    		  	$ifCount{$groupe}{ethernet}= $ethernet;
    Je ne sais pas comment lui dire que quand le clés existe déjà il additionne les ports, et autrement il crée une nouvelle clé.


    merci,

  11. #11
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Qu'as tu en faisant ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (defined $ifCount{$groupe}{tot}) {
      $ifCount{$groupe}{tot}         += $tot;
    #  $ifCount{$groupe}{up}          += $up;
    #  $ifCount{$groupe}{ethernet}  += $ethernet;
    }

  12. #12
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 58
    Par défaut
    il me multiplie chaque ports tot du hash par 2

  13. #13
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    recolle ton code complet.
    Je viens de voir cette declaration dans ton premier thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my %ifCount;
    my $ifCount;
    A eviter des variables qui ont le même nom.

  14. #14
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 58
    Par défaut
    OUi, ok. mais je ne pense pas que le problème vienne de là

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    use strict;
    use Data::Dumper;
     
    BEGIN {
    	unshift @INC, '/PRD/SYDN/perl-lib';
    };
     
    use Net::SNMP;
     
    my %ifCount;
    my $ligne;
    my $tot;
    my $up;
    my $ethernet;
    my %Count;
    my $groupe;
    my $key;
     
     
     
    open FICHIER,"<input.csv " or die "le fichier n existe pas";
     
    while ($ligne = <FICHIER>){
    	chomp ($ligne);
     
    		my $machine;
    		my $community;
     
     
    		%Count=0;
     
    		($machine,$community,$groupe) = split (/;/,$ligne);
     
    		my ($session, $error) = Net::SNMP->session(
    			      -version     => 'snmpv2c',
    			      -hostname    => $machine,
    			      -community   => $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 $ifOperStatus		= $session->get_table(	-baseoid => "1.3.6.1.2.1.2.2.1.8" );
     
     
    		#On va compter les porte totale, ethernet et ethernet UP
     
     
    	foreach  my $C (values %$ifIndex){
     
     
    		  $Count{glob}++;
    		  next unless $$ifType{'1.3.6.1.2.1.2.2.1.3.'.$C} == 6; 
        		  $Count{Ethernet_tot}++;
                      $Count{up}++   if $$ifOperStatus{'1.3.6.1.2.1.2.2.1.8.'.$C} == 1 ;
     
    		#on pourrait les mettres dans $tot $up $etherup
     
    		  $tot = $Count{glob};
    		  $up  = $Count{up};
    		  $ethernet = $Count{Ethernet_tot}; 
     
     
     
    		#Afficher 0 quand il n'y a pas de port UP
     
    	if ($up == 0) 
    		{$up ="0";}
    }
     
     
    		#on va stocker le résultats dans ifCount.
     
    			$ifCount{$groupe}{tot}= $tot; 
    		  	$ifCount{$groupe}{up}= $up;
    		  	$ifCount{$groupe}{ethernet}= $ethernet; 
     
     
     
    		print 	"$groupe \t".
    			"Port tot:$tot  \t". 
    			"Ethernet:$ethernet  \t".
    			"Ethernet up:$up  \n";
     
    	}
     
     
    		print Dumper( \%ifCount);	
     
    close FICHIER;
    Je suis casi certain que le problème est au niveau de la creation du hash mais je ne vois pas cmt faire...

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

Discussions similaires

  1. [MySQL] Compter le contenu de plusieurs lignes SQL
    Par Alexcontact dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/07/2015, 16h20
  2. Mettre le contenu de plusieurs lignes dans une seule case
    Par bellamouna dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 09/12/2008, 12h11
  3. Associé contenu de plusieur ligne à une clé
    Par Mimiche dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 07/12/2007, 09h50
  4. Réponses: 9
    Dernier message: 11/09/2007, 10h08
  5. Réponses: 5
    Dernier message: 05/09/2007, 20h12

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