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

Programmation et administration système Perl Discussion :

Comparaison de deux fichiers et gestion du delta


Sujet :

Programmation et administration système Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Par défaut Comparaison de deux fichiers et gestion du delta
    Bonjour,

    Je souhaiterai obtenir vos lumières pour le problème suivant.

    J'ai deux conf, appartenant à deux équipements, que je dois comparer. Il y a une conf de référence "c1" et la conf à comparer avec la référence "c2". Le but de cette comparaison est de trouver le delta entre ces deux fichiers afin d'adapter "c2" afin d'être en adéquation avec "c1".

    Jusque la aucun problème, j'arrive à comparer les deux confs et à savoir où sont les différences.

    C'est là que je coince ! Prenons un exemple, j'ai 79 différences entre les deux fichiers de conf. Parmi ces 79 différences, une 40aine sont des différences qui ne sont pas des erreurs (exemple : Hostname, date quelconque etc etc). Est ce que vous auriez une idée afin de scinder facilement les erreurs et les différences ?

    La seule idée que j'ai actuellement est de faire des regex pour chaque type potentiel d'erreur mais ça risque de prendre bien trop de temps tout en étant pas certain que ça marche...

    Voici mon code de comparaison :

    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
    my $fichierReference = "f1.txt";
    my $fichierVerif = "f2.txt";
    my $fichierResultat;
     
    my $line1;
    my $line2;
     
    my @contenu1;
    my @contenu2;
     
    my $cpt_diff = 0;
     
    ###################################################
    #                                                 #
    #                   Programme                     #
    #                                                 #
    ###################################################
     
    ##################################################
    #     Ouverture des deux fichiers à comparer     #
    ##################################################
     
    open(FILER,$fichierReference);
    open(FILEV,$fichierVerif);
    open(FILEC,">resultat_comparaison.txt") or die ("Erreur d'ouverture du fichier\n");
     
    ####################################
    #     Comparaison des fichiers     #
    ####################################
     
    while(defined($line1 = <FILER>) && defined($line2 = <FILEV>))
    {
            if ($line1 eq $line2)
            {
                    print FILEC "Ligne $. : C'est bon !\n";
            }
            else
            {
                    print FILEC "Ligne $. : Il y a une différence !\n";
                    $cpt_diff++;
            }
    }
     
    print FILEC "Le delta de différence est de $cpt_diff\n";
    Merci d'avance !

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Bonjour, pourrais-tu illustrer un peu plus ta demande en postant un extrait de c1 et son extrait correspondant c2 comprenant des différences et des erreurs, ainsi qu'une description (si possible exhaustive) des types d'erreurs que tu rencontres.

    ps: évite d'ajouter les numéros de ligne.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Par défaut
    Erreur (non présence de deux packages dans c2 Test n°12) + erreur au niveau de la date dans une autre commande :

    c1 :
    **********
    patch.log
    **********

    11:26:04,954 ERROR actions.UpdateJarFile - java.io.IOException: Stream closed

    Test n°12
    Commande : yum list installed | egrep -e tcpdump|libpcap|lksctp-tools

    libpcap.x86_64 14:1.0.0-6.20091201git117cb5.el6
    lksctp-tools.i686
    lksctp-tools.x86_64
    tcpdump.x86_64 14:4.0.0-3.20090921gitdf3cb4.2.el6

    ###################
    # Config Securité #
    ###################


    Test n°1
    Commande : yum list installed | egrep -e curl

    curl.x86_64 7.19.7-36.el6_4
    libcurl.i686 7.19.7-36.el6_4
    libcurl.x86_64 7.19.7-36.el6_4
    python-pycurl.x86_64
    c2 :
    **********
    patch.log
    **********

    11:25:50,954 ERROR actions.UpdateJarFile - java.io.IOException: Stream closed
    Test n°12
    Commande : yum list installed | egrep -e tcpdump|libpcap|lksctp-tools

    libpcap.x86_64 14:1.0.0-6.20091201git117cb5.el6
    tcpdump.x86_64 14:4.0.0-3.20090921gitdf3cb4.2.el6

    ###################
    # Config Securité #
    ###################


    Test n°1
    Commande : yum list installed | egrep -e curl

    curl.x86_64 7.19.7-36.el6_4
    libcurl.i686 7.19.7-36.el6_4
    libcurl.x86_64 7.19.7-36.el6_4
    python-pycurl.x86_64
    Différence :

    c1 :
    ########################
    # Configuration réseau #
    ########################


    Test n°1
    Commande : hostname

    machine1

    Test n°2
    Commande : ifconfig -a | egrep -v RX|TX|collisions

    bond0 Link encap:Ethernet HWaddr xxxxxxx
    UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
    c2 :
    ########################
    # Configuration réseau #
    ########################


    Test n°1
    Commande : hostname

    machine2

    Test n°2
    Commande : ifconfig -a | egrep -v RX|TX|collisions

    bond0 Link encap:Ethernet HWaddr yy:yy:yy:yy:yy:yy
    UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
    Au niveau de la description des erreurs que je peux avoir ça risque d'être compliqué... La liste contient toutes les erreurs possibles que l'on peut pas lors de la configuration d'un équipement :
    - Paquets pas installés
    - Droits sur certains dossiers érronés
    - Taille des disques mal configurée
    - Config réseau fausse
    - Dossiers/fichiers qui n'ont pas été créés
    - Routage incomplet
    - Configuration de mot de passe ou autres paramètres faux/incomplets
    - ...

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    je trouve que ton traitement de comparaison est peu robuste. Il suffit d'une seule interligne de différence quelque part pour que plus rien ne marche ensuite.

    Personnellement, il me semble qu'il serait préférable de charger la config 1 dans un hash, puis de lire la config 2 et de comparer. C'est bien sûr un peu plus de travail, mais nettement plus sûr.

    Pour ta question proprement dite, je verrais aussi bien d'avoir un hash de configuration dressant la liste des éléments qui peuvent être différents entre deux config.

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Par défaut
    Ce que tu propose me semble être une bonne idée !

    Est ce que tu pourrais juste me donner un petit exemple sur comment tu vois la chose stp ? J'ai du mal à me représenter comment tu peux mettre par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my %hDiff = ( "hostname"     => ???,
              "@IP" => ???,
              "@MAC"   => ??? );
    Pour ensuite lui dire que si c'est hostname alors on passe à la "case" suivante dans le hashtab ?

    Merci pour ton aide.

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Peu importe en fait ce que tu mets comme valeur. Tu peux par exemple faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my %hDiff = ( "hostname"     => 1,
              '@IP' => 1,
              '@MAC'   => 1 );
    A noter que j'ai remplacé les guillemets par des apostrophes parce que sinon, Perl risque d'interpréter @IP comme le nom d'une variable de type tableau. L'autre solution est de préfixer l'arobase par un antislash.

    Ensuite, quand tu trouves une différence sur un enregistrement, tu testes simplement l'existence de la clef:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (exists $IP) {
         print "Cette différence n'est pas une anomalie\n";
    } else {
         print "Anomalie sur ce champ.\n";
    }

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

Discussions similaires

  1. Comparaison de deux fichiers Excel
    Par Fab_lux dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/08/2007, 21h41
  2. comparaison de deux fichiers
    Par john123 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 17/03/2007, 16h38
  3. Comparaison de deux fichiers EXCEL
    Par meufeu dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/10/2006, 22h56
  4. comparaison de deux fichiers textes
    Par chmaichel dans le forum Delphi
    Réponses: 1
    Dernier message: 28/07/2006, 11h35
  5. [langage] Comparaison de deux fichiers
    Par perlgirl dans le forum Langage
    Réponses: 4
    Dernier message: 04/05/2005, 16h05

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