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 :

Probleme de condition


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 197
    Par défaut Probleme de condition
    Bonjour a tous, ja i un petit probleme concernant le traitement d un fichier:


    Voici un bout du fichier en question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     NO_IP;00:08:02:E4:47:0C;19;Fa3/25;SXBswACC-H5-1;SXB-BatH-Etage5;10.45.36.18; 
    
     10.45.136.27;00:0E:7F:68:92:BF;28;Fa0/6;SXBswACC-Schutz206-2;SXB-Schutz20-Etage4;10.45.120.23;
    
     10.45.135.270;00:16:35:0D:AE:65;27;Fa3/16;SXBswACC-Schutz205-1;SXB-Schutz20-Etage5;10.45.120.20;
    
    10.45.44.29;00:08:02:E4:47:0C;19;Fa3/25;SXBswACC-H5-1;SXB-BatH-Etage5;10.45.36.18;
    
     10.45.41.149;00:14:C2:57:2A:8E;16;Fa2/17;SXBswACC-H2-1;SXB-BatH-Etage2;10.45.36.10;
    
     NO_IP;00:12:79:63:68:DC;13;Fa0/7;SXBswACC-Schilik2-3;SXB-Schilik-Etage2;10.45.148.8;

    Le probleme c est que dans ce fichier j ai des lignes que je voudrais supprimer. Sur les deux lignes en gras celle avec NO_IP est mauvaise.

    J ai essayé de developpez un petit script mais la boucle avec le compteur qui devrait etre a zero est toujours verifiez et ca n est pas normal.

    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
    79
    80
    81
    82
    83
    84
    85
    86
    #!/usr/bin/perl
    use strict;
    package sous_fonc_boucle;      #Mettre un '.' si le module et pro_prin sont ds le meme rep sinon './rep'
    sub Fonc_TRAITEMENT_Boucle
    {
            my $Flag = 0;
            my @Tableau_fichier;
            my @Tableau_fichier_identique;
            my $Ligne_Fichier_Final;
            my $Adresse_IP;
            my $Adresse_MAC;
            my $Vlan;
            my $Port;
            my $Nom_Switch;
            my $Loc_Switch;
            my $Adresse_Poste;
    
            open(OLD, "/home/rappju/projet_2/fichier_FINAL.csv") or die("Lecture du fichier resultat impossible : $!");
            open(NEW, ">/home/rappju/projet_2/final_BASE.csv") or die("Creation du Fichier sans port channel impossible : $!");
    
            while(<OLD>)
            {
                    push(@Tableau_fichier,$_);
            }
            @Tableau_fichier_identique=@Tableau_fichier;
            foreach(@Tableau_fichier)
            #On parcourt resultat_info_switch_partie_2.csv
            {
                    $Ligne_Fichier_Final=$_;
                    if (($Ligne_Fichier_Final) =~ /\W*(.*);(.*);(.*);(.*);(.*);(.*);(.*);/)
                    #On recupere dans l ordre Vlan MAC PORT
                    {
                            $Adresse_IP=$1;
                            $Adresse_MAC=$2;
                            $Vlan=$3;
                            $Port=$4;
                            $Nom_Switch=$5;
                            $Loc_Switch=$6;
                            $Adresse_Poste=$7;
                            print"\n#Adresse_IP[$Adresse_IP]#Adresse_MAC[$Adresse_MAC]#Vlan[$Vlan] #Port [$Port] #Nom_Switch [$Nom_Switch]#Loc_Switch[$Loc_Switch]#Adresse_Poste [$Adresse_Poste]##\n";
    
                    #NO_IP       00:50:DA:39:89:4B 13 Fa3/6 SXBswACC-H0-2 SXB-BatH-RdC 10.45.36.5
                    #10.45.38.43 00:50:DA:39:89:4B 13 Fa3/6 SXBswACC-H0-2 SXB-BatH-RdC 10.45.36.5
                            my $Compteur_print=0;
                            if($Adresse_IP=~/NO_IP/)
                            {
                                    while(<OLD>)
    #foreach(@Tableau_fichier_identique)
                                    {
                                            chomp($_);
                                            print "\n###ligne du while dans le NO IP $_\n";
                                            if($_=~/\d+\.\d+\.\d+\.\d+;$Adresse_MAC;$Vlan;$Port;$Nom_Switch;$Loc_Switch;$Adresse_Poste;/)
                                            {
                                                    #Cas ou l on a la meme ligne avec NO_IP et Adresse IP
                                                    #NO_IP       00:50:DA:39:89:4B 13 Fa3/6 SXBswACC-H0-2 SXB-BatH-RdC 10.45.36.5
                                                    #10.45.38.43 00:50:DA:39:89:4B 13 Fa3/6 SXBswACC-H0-2 SXB-BatH-RdC 10.45.36.5
                                                    print"\n##Compteur_print avant presence d une ligen, identique avec IP[$Compteur_print]\n";
                                                    $Compteur_print=$Compteur_print+1;
                                                    print"\n##Compteur_print avant presence d une ligen, identique avec IP[$Compteur_print]\n";   
                                            }
                                            print"\n##Compteur_print apres test NO_IP[$Compteur_print]\n";
                                    }
                                    if($Compteur_print=="0")                                {
                                            print"\n##Cas ou l on a NO_IP sans adresse IPdan la boucle ==0[$Compteur_print]\n";
                                            print"\n##NO_IP;$Adresse_MAC;$Vlan;$Port;$Nom_Switch;$Loc_Switch;$Adresse_Poste;##\n";
                                            print NEW "NO_IP;$Adresse_MAC;$Vlan;$Port;$Nom_Switch;$Loc_Switch;$Adresse_Poste;\n";
                                    }
                            }
                            elsif(($Adresse_IP)=~/\d+\.\d+\.\d+\.\d+/)
                            {
                                    print"\n#CAS ligne unique #$Adresse_IP;$Adresse_MAC;$Vlan;$Port;$Nom_Switch;$Loc_Switch;$Adresse_Poste;##\n";
                                    print NEW "$Adresse_IP;$Adresse_MAC;$Vlan;$Port;$Nom_Switch;$Loc_Switch;$Adresse_Poste;\n";
    
                            }
                            elsif($Adresse_IP=~/SELF/)
                            {}#On ne fait rien
    
                    }#Fin du if pour recuperer les valeurs
            }#Fin du foreach sur le tableau
    
            close(OLD);
            close(NEW);
    }
    1;
    &Fonc_TRAITEMENT_Boucle;
    La condition en gras est toujours respectée !!!!
    Pour une fois personne ne pourras me dire montre moi ton code !!!!

    Merci d avance et bon courage


    Jules

  2. #2
    Membre confirmé

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Par défaut
    j'ai pas trop compris ce qu'est censé faire ton script et j'ai la flemme de le découvrir tout seul... :s

    Une chose est sure, cé normal que ton compteur $Compteur_print reste à 0 !
    tu ne peux pas entrer dans ta boucle while(<OLD>), seul endroit ou tu l'incrémentes !
    la raison est simple : tu es déjà à la fin du fichier... (tu as déjà fait un while(<OLD>) :s)
    je pense que ton foreach(@Tableau_fichier_identique) était mieux...
    pourkoi tu l'as commenté :s ça devait être pour ça que tu l'avais créé...
    bref, vire le while(<OLD>), enlève ton commentaire devant le foreach et ça devrai être mieux

    Rq : tu le remets à 0 pour chaque élément du tbl @Tableau_fichier, je suppose que c'est voulu..

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 606
    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 606
    Par défaut
    Pour ton if en gras

    if ($Compteur_print == 0), ça devrait être mieux (vire les " " entourant ton 0)


  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    As-tu vraiment besoin de tous ces print ? Sinon je te propose une alternative plus simple :
    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
     
    #! /usr/bin/perl
    use strict;
    use warnings;
     
    open my $old_file, '<', '/home/rappju/projet_2/fichier_FINAL.csv' 
      or die "Lecture du fichier resultat impossible : $!\n";
    open my $new_file, '>', '/home/rappju/projet_2/final_BASE.csv' 
      or die"Creation du Fichier sans port channel impossible : $!\n";
     
    my %lines;
    while(my $line = <$old_file>){
      chomp($line);
      my ($ip, $line_without_ip) = split /;/, $line, 2;
      $lines{$line_without_ip}++ if $ip =~ m/\d+\.\d+\.\d+.\d+/;
    }
     
    seek $old_file, 0, 0;
     
    while(my $line = <$old_file>){
      chomp($line);
      my ($ip, $line_without_ip) = split /;/, $line, 2;
      if( $ip =~ m/NO_IP/ ){
        print {$new_file} $line, "\n" unless exists $lines{$line_without_ip};
      }
      else {
        print {$new_file} $line, "\n";
      }
    }
     
    close $new_file
      or die "Fermeture du fichier sans port channel impossible : $!\n";
    close $old_file
      or die "Fermeture du fichier résultat impossible : $!\n";
     
    __END__
    (si j'ai bien compris tu veux supprimer toutes les lignes NO_IP dont la seconde partie (après l'ip) se trouve aussi dans une ligne avec ip ?)

    --
    Jedaï

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 05/05/2006, 09h13
  2. [AS] Probleme de condition
    Par Treuze dans le forum Flash
    Réponses: 8
    Dernier message: 25/03/2006, 15h27
  3. probleme de condition et de boucle
    Par avantoux dans le forum ASP
    Réponses: 5
    Dernier message: 23/03/2006, 08h59
  4. Probleme de conditions
    Par guy2004 dans le forum Langage
    Réponses: 11
    Dernier message: 05/11/2005, 14h54
  5. probleme gestion condition switch - case
    Par DarkMax dans le forum Langage
    Réponses: 5
    Dernier message: 07/09/2005, 14h25

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