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

  1. #1
    Membre habitué
    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
    Points : 156
    Points
    156
    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 éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    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.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre habitué
    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
    Points : 156
    Points
    156
    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
    Points : 12 256
    Points
    12 256
    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 habitué
    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
    Points : 156
    Points
    156
    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
    Points : 12 256
    Points
    12 256
    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";
    }

  7. #7
    Membre habitué
    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
    Points : 156
    Points
    156
    Par défaut
    Pour commencer, j'ai lu les différents articles présents dans ta signature concernant les hashtables. Ils ont été assez bénéfiques, ça m'a permis de mieux comprendre comment fonctionnent les hashtables. Cependant pour mon problème je reste dans le flou...

    Je ne comprends pas comment partir :

    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
    my $fichierResultat;
     
    my %hConf = ("hostname" => 1, '@IP' => 1, '@MAC' => 1, 'date' => 1);
     
    my %hRef = ();
     
    my %hDiff = ();
     
    my $line1;
    my $line2;
     
    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($line1 = <FILER>)
    {
            print "$line1\n";
            chomp($line1);
            $hRef{$.} = $line1;
    }
     
    while($line2 = <FILEV>)
    {
            if(exists $IP)
            {
                    print "Cette différence n'est pas une anomalie\n";
            }
            else
            {
                    print "Anomalie sur ce champ\n";
            }
    }
    Je remplis le premier tableau de hash avec comme key le numéro de ligne. Est-ce déjà un bon départ ? J'ai vraiment du mal à imaginer comment faire pour comparer la ligne de FILEV qu'on lit actuellement avec la même ligne stockée dans %hRef.

  8. #8
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    quelque chose dans ce genre:
    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
     
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %hash_conf_1;
     
    while (<DATA>) {
    	chomp;
    	my ($key, $value) = split / /, $_;
    	$hash_conf_1{$key} = $value;
    }
     
    print Dumper \%hash_conf_1;
     
    __DATA__
    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
    Ce qui affiche le hachage suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $VAR1 = {
              'libcurl.x86_64' => '7.19.7-36.el6_4',
              'libcurl.i686' => '7.19.7-36.el6_4',
              'curl.x86_64' => '7.19.7-36.el6_4'
            };

  9. #9
    Membre habitué
    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
    Points : 156
    Points
    156
    Par défaut
    Bonjour,

    Merci pour cette aide, je vais tester tout ça et je vous tiens au courant !

    EDIT : Désolé, je n'ai pas été assez clair lors de la déclaration de mes tests. L'affichage n'est pas tout le temps égal à xxx xxxx

    Voici d'autres exemples de tests :

    **********
    install.history
    **********


    **********
    patchPM_5.0.0.28B1.log
    **********


    **********
    patchPM_5.0.0.2B1.log
    **********

    11:25:04,122 ERROR actions.UpdateJarFile - java.io.IOException: Stream closed

    **********
    patchPM_5.0.0.34B1.log
    **********

    11:25:24,983 ERROR actions.UpdateJarFile - java.io.IOException: Stream closed

    **********
    patchPM_5.0.0.3B1.log
    **********


    **********
    patchPM_5.0.0.45B4.log
    **********


    **********
    patchPM_LogicComponent_3GPP_Rx_PM_5.0.0.38B1.log
    **********


    ----------------------------------------------------------

    02 - Vérification des services
    TestID = 175 - Step name = 0
    Commande : /opt/application/xxx/xxx/xxx/xxx/xxx

    find: `/config/log': No such file or directory

    07 - Vérification des scripts arrêt/reload
    TestID = 180 - Step name = 0
    Commande : ls /opt/application/xxx/xxx/xxx/

    a.ksh
    b.ksh
    c.ksh
    d.ksh

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

    bond0 Link encap:Ethernet HWaddr AA:00:FF:00:00:00
    UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1

    bond0.240 Link encap:Ethernet HWaddr CC:20:C9:02:B8:60
    inet addr:xx.xx.xx.xx Bcast:xx.xx.xx.xx Mask:xx.xx.xx.xx
    UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1


    Test n°5
    Commande : ls -l /images

    total 20
    drwx------ 2 root root 16384 Jan 14 2014 lost+found
    drwxrwxrwx 4 user user 4096 Dec 4 12:15 user
    Ce qu'y serait bien c'est que la clé de chaque hash serait égal à ******** xxx ******* / 0x - xxxxxxxx / Test n°XX et que la value associée soit égale à tout ce qui suit jusqu'au prochain ******** xxx ******* / 0x - xxxxxxxx / Test n°XX exclut !

    A mon avis ça risque d'être un peu complexe... Le mieux serait d’homogénéiser toutes les entêtes afin de d'initialiser toutes les $key assez facilement avec une seule et même regex ?

  10. #10
    Membre habitué
    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
    Points : 156
    Points
    156
    Par défaut
    Bonjour,

    Si j'effectue un pré-traitement sur les deux fichiers en enlevant tous les sauts de ligne ça peut déjà permettre d'enlever un certain nombre d'erreurs n'est-ce pas ?

    Je suis entrain de le tester mais ça ne marche pas encore...

    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
    open(FILER,$fichierReference);
    open(FILEV,$fichierVerif) or die "Erreur !!\n";
    open(FILEC,">resultat_comparaison.txt") or die ("Erreur d'ouverture du fichier\n");
    open(FRM,"+>fic_ref.txt");
    open(FDM,"+>fic_diff.txt");
     
    ####################################
    #     Comparaison des fichiers     #
    ####################################
     
    while (<FILER>)
    {
            chomp;
            if ($_ !~ s/ \n//gs && $_ ne "")
            {
                    print FRM "$_\n";
            }
            else
            {
                    print "C'est une ligne vide\n";
            }
    }
     
    while (<FILEV>)
    {
            chomp;
            if ($_ !~ s/ \n//gs && $_ ne "")
            {
                    print FDM "$_\n";
            }
    }
     
    close(FRM);
    close(FDM);
    open(FRM,"<fic_ref.txt");
    open(FDM,"<fic_diff.txt");
     
    while(defined($line1 = <FRM>) && defined($line2 = <FDM>))
    {
            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 égal à : $cpt_diff\n";
    Merci !

    [EDIT] : C'est bon ça marche. Une idée pour que ça soit encore plus fiable ?

  11. #11
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Il ne me paraît pas très utile de faire un pré-traitement sur les lignes vide, il suffit de les sauter à la volée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (<$IN>) {
         next if /^[\*\s]*$/;   # saute les lignes vides ou ne contenant que des espaces et des astérisques
         chomp;
         # maintenant traiter les lignes qui restent ...
    }

  12. #12
    Membre habitué
    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
    Points : 156
    Points
    156
    Par défaut
    Bonjour,

    Merci pour ce bout de code !

    La solution avec les tables de hash bien trop complexe à mettre en place non ?

  13. #13
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Je ne pense pas particulièrement, c'est tout simple un hachage. Mais il me semble surtout que tes fichiers de config sont très irréguliers, ce qui ne simplifie pas leur parsing.

  14. #14
    Membre habitué
    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
    Points : 156
    Points
    156
    Par défaut
    En effet, il n'y a pas de pattern qui revient tout le temps sur lequel on peut se baser.

    Est ce que quelque chose dans ce genre pourrait marcher ?

    Algo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    boucle
       print($cpt);
       $cpt++;
       hash{$cpt} = ???
       **résultat de la commande rentré dans la valeur du hash qui a la valeur cpt jusqu'au prochain entier seul sur une ligne**
    finboucle
    Le seul bémol c'est que je ne vois pas comment attribuer les lignes de x à y à la valeur du hash{$cpt}

  15. #15
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Éventuellement, en ce qui concerne la partie comparaison des deux fichiers, la ligne entière pourrait servir de clef de hachage. Un truc dans ce genre:

    Tu lis ton premier fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    # use strict, etc, ouverture du fichier 1, etc...
    my %hash_fic1;
    while (<$IN1>) {
         chomp;
         next unless /\w/;  # élimine lignes vides
         $hash_fic1($_} = 1;
    }
    Ensuite, tu lis le fichier 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # ouverture fichiier 2
    while (<$IN2>) {
         chomp;
         next unless /\w/;  # élimine lignes vides
         if (exists $hash_fic1{$_}) {
              $hash_fic1{$_} ++
         } else {
              print "ligne absente de fic 1: $_ \n";
         }
    }
    for my $cle (keys %hash) {
         print "Ligne absente de fic 2: $cle \n" if $hash($cle} < 2;
    }
    EDIT: corrigé une accolade manquante dans le second bout de code.

  16. #16
    Membre habitué
    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
    Points : 156
    Points
    156
    Par défaut
    Pour commencer, merci pour ton aide.

    Je suis en train de tester et pour le moment ça marche plutôt très bien !

    EDIT : Dernière version qui fonctionne très très bien !
    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
     
    open(FILER,$fichierReference);
    open(FILEV,$fichierVerif) or die "Erreur !!\n";
    open(FILEC,">resultat_comparaison.txt") or die ("Erreur d'ouverture du fichier\n");
     
    while (<FILER>)
    {
            chomp;
            next unless /\w/;   # élimine les lignes vides
            $hash_fic1{$_} = 1;
    }
     
    while (<FILEV>)
    {
            chomp;
            next unless /\w/;
            if (exists $hash_fic1{$_})
            {
                    $hash_fic1{$_} ++;
            }
            else
            {
                    print FILEC "Ligne différente (fic 2) : $_\n";
            }
    }
     
    for my $cle (keys %hash_fic1)
    {
            print FILEC "Ligne différente (fic 1) : $cle\n" if $hash_fic1{$cle} < 2;
    }
     
    close(FILER);
    close(FILEV);
    close(FILEC);
    Dernier point pour que tout soit OK !

    Il faut que je ne prenne pas en compte les lignes qui sont sous la forme :
    <rep:TimeStamp>2015-02-11T15:40:00.198Z</rep:TimeStamp>
    EDIT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    next unless /\w/;
    next if /<rep:TimeStamp>/;
    Ca marche

+ 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