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 :

Comparaison de fichiers avec tableaux de hash


Sujet :

Langage 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 fichiers avec tableaux de hash
    Bonjour,

    Je suis en train de développer un script permettant de comparer deux fichiers et de renvoyer le résultat de cette comparaison dans un fichier résultat.

    Voilà le code (je skip tout ce qui est librairies, déclarations des variables etc le problème n'est pas ici) :

    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
    open(FILER,$fichierReference);
    open(FILEV,$fichierVerif) or die "Erreur !!\n";
    open(FILEC,">resultat_comparaison.txt") or die ("Erreur d'ouverture du fichier\n");
     
    ####################################
    #     Comparaison des fichiers     #
    ####################################
     
    while (<FILER>) {
            chomp;
            #next unless /\w/; #or $_ =~ /<rep:TimeStamp>.*<\/rep:TimeStamp>/;   # élimine les lignes vides
            #next if /<rep:TimeStamp>/;
            #if ($_ =~ m/^[a-z]{3}\d+\,([.*]\,[.*]\,[.*])$/) {
            if ($_ =~ m/^.*201[5|6]\,(.*)$/) {
                    $lineR = $1;
            } else {
                    $lineR = $_;
            }
            $hash_fic1{$lineR} = 1;
    }
     
    while (<FILEV>) {
            chomp;
            #next unless /\w/;# or $_ =~ /<rep:TimeStamp>/;
            #next if /<rep:TimeStamp>/;
            if ($_ =~ m/^.*[0-9]{4}\,(.*)$/) {
                    $lineV = $1;
            } else {
                    $lineV = $_;
            }
            print $lineV."\n";
            if (exists $hash_fic1{$lineV}) {
                    $hash_fic1{$lineV} ++;
            } else {
                    print FILEC "Ligne différente (fic 2) : $lineV\n";
            }
    }
     
    for my $cle (keys %hash_fic1) {
            print FILEC "Ligne non présente dans le fichier de à vérifier : $cle\n" if $hash_fic1{$cle} < 2;
    }
     
    close(FILER);
    close(FILEV);
    close(FILEC);
    Admettons que mon fichier de référence contienne :
    Mon Nov 02 10:55:22 CET 2015, aa
    Mon Nov 02 10:55:22 CET 2015, bb
    Mon Nov 02 10:55:22 CET 2015, cc
    Mon Nov 02 10:55:22 CET 2015, dd
    Mon Nov 02 10:55:22 CET 2015, dd
    Mon Nov 02 10:55:22 CET 2015, ee
    Mon Nov 02 10:55:22 CET 2015, ff
    Et que mon deuxième fichier contienne :
    Mon Nov 02 10:55:22 CET 2015, aa
    Mon Nov 02 10:55:22 CET 2015, bb
    Mon Nov 02 10:55:22 CET 2015, cc
    Mon Nov 02 10:55:22 CET 2015, dd
    Mon Nov 02 10:55:22 CET 2015, ee
    Il manque un dd et le ff. Avec le code ci-dessus, dans le fichier résultat, j'aurais une ligne indiquant qu'il manque la ligne ff.
    Cependant, comme la ligne dd est présente une fois dans le fichier vérif il ne m'affiche pas qu'il manque une ligne dd.

    Savez-vous comment pourrais-je faire pour prendre en compte ce problème ?

    Merci d'avance,

    Cdlt

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour ciols,

    Au lieu de vérifier la présence ou l'absence des clés de ton hash, tu pourrais utiliser les valeurs.
    A ta place, je parcourerais les 2 fichiers et créerais 2 hash comptant chacune des différentes lignes.
    Ensuite, je terminerais par comparer les clés et valeurs des 2 hash.

    Maintenant, à toi de voir si cela correspond avec ce que tu veux faire ultérieurement.
    -- Jasmine --

  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
    Tout d'abord merci pour ta réponse.

    Si j'ai bien compris avec ta solution on aurait potentiellement :
    hash1{l1} = 1
    hash2{l1} = 1
    hash1{l2} = 2
    hash2{l2} = 2
    etc

    En pensant à ce schéma j'ai oublié de préciser que l'ordre entre les deux fichiers n'est pas certain. C'est à dire que ça peut très bien être ff, bb, cc, aa, dd, ee

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par ciols Voir le message
    Si j'ai bien compris avec ta solution on aurait potentiellement :
    hash1{l1} = 1
    hash2{l1} = 1
    hash1{l2} = 2
    hash2{l2} = 2
    etc
    Oui, exactement.

    Citation Envoyé par ciols Voir le message
    En pensant à ce schéma j'ai oublié de préciser que l'ordre entre les deux fichiers n'est pas certain. C'est à dire que ça peut très bien être ff, bb, cc, aa, dd, ee
    Cela ne change rien.
    -- Jasmine --

  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
    D'accord je vais faire ça ! Merci pour tes réponses, je reviens asap pour vous tenir au courant.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    4 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 4 223
    Points : 12 515
    Points
    12 515
    Par défaut
    Bonjour,

    Une autre solution qui n'utiliserait qu'un seul tableau, c'est pour le premier fichier tu incrémentes les valeurs de ton tableau et pour le deuxième fichier tu décrémentes.
    Comme ça au final:
    si la valeur est 0, alors ok.
    si la valeur est négative, c'est que tu as un manque dans le premier fichier.
    si la valeur est positive, le manque est dans le deuxième fichier.
    Cordialement.

  7. #7
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    Une autre solution qui n'utiliserait qu'un seul tableau, c'est pour le premier fichier tu incrémentes les valeurs de ton tableau et pour le deuxième fichier tu décrémentes.
    Comme ça au final:
    si la valeur est 0, alors ok.
    si la valeur est négative, c'est que tu as un manque dans le premier fichier.
    si la valeur est positive, le manque est dans le deuxième fichier.
    C'est vraiment une astuce très intelligente ... je vais la retenir ... ça pourra toujours servir.
    -- Jasmine --

  8. #8
    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
    Hello,

    J'ai utilisé la solution de disedorgue qui me semble plus simple à mettre en place, 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
    GetOptions ("ref=s" => \$fichierReference,"verif=s" => \$fichierVerif) or die("Erreur dans les arguments\nExemple : ./compare_conf_pcrf --ref chemin_fichier_1 --verif chemin_fichier_2\n");
    if (defined($fichierReference) && defined($fichierVerif)) {
            open(FILER,$fichierReference);
            open(FILEV,$fichierVerif) or die "Erreur !!\n";
            open(FILEC,">../data/resultat_comparaison.txt") or die ("Erreur d'ouverture du fichier\n");
            compare();
    } else {
            print "Erreur dans les arguments\nExemple : ./compare_conf_pcrf --ref chemin_fichier_1 --verif chemin_fichier_2\n"
    }
     
    sub compare {
            while (<FILER>) {
                    chomp;
                    if ($_ =~ m/^.*201[5|6]\,(.*)$/) {
                            $lineR = $1;
                    } else {
                            $lineR = $_;
                    }
                    $hash_fic1{$lineR}++;
            }
     
            while (<FILEV>) {
                    chomp;
                    if ($_ =~ m/^.*201[5|6]\,(.*)$/) {
                            $lineV = $1;
                    } else {
                            $lineV = $_;
                    }
                    $hash_fic1{$lineV}--;
            }
     
            foreach my $key (keys %hash_fic1) {
                    if ($hash_fic1{$key} > 0) {
                            for (my $i = 0 ; $i < $hash_fic1{$key} ; $i++) {
                                    print FILEC "La ligne $key n'est pas présente dans le fichier de vérification\n";
                            }
                    }
            }
    }
    Et ça marche parfaitement !

    Merci beaucoup à vous !

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    Une autre solution qui n'utiliserait qu'un seul tableau, c'est pour le premier fichier tu incrémentes les valeurs de ton tableau et pour le deuxième fichier tu décrémentes.
    Comme ça au final:
    si la valeur est 0, alors ok.
    si la valeur est négative, c'est que tu as un manque dans le premier fichier.
    si la valeur est positive, le manque est dans le deuxième fichier.
    Solution similaire : tu crées la clé dans le tableau lors du premier parcours du fichier, et tu la retires (delete) dans le parcours du deuxième en vérifiant si elle existe :
    - tu détectes l'absence dans le premier fichier lors de la lecture du deuxième fichier
    - tu détectes l'absence dans le deuxième fichier en regardant les clés qui subsistent dans le tableau

    Si les deux fichiers sont similaires (notamment triés de la même manière), une lecture "en parallèle" (100 lignes par 100 lignes par exemples) des deux fichiers peut limiter la taille du hash (utile si les fichiers ont des tailles supérieures à, disons, la centaine de Mo).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

Discussions similaires

  1. Comparaison de fichiers avec CompareUI
    Par alain.bernard dans le forum Eclipse Platform
    Réponses: 7
    Dernier message: 19/11/2012, 22h49
  2. Comparaison deux fichiers avec cobol
    Par Babylone159 dans le forum Cobol
    Réponses: 5
    Dernier message: 03/09/2012, 12h36
  3. [Débutant] Comparaison de fichiers avec RichtextBox
    Par Informaticia dans le forum C#
    Réponses: 2
    Dernier message: 01/06/2012, 08h00
  4. comparaison 1 fichier avec 1 feuille à 1 fichier avec 2 feuilles
    Par sofiane06 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/08/2008, 13h21
  5. [MCRYPT] Est-il possible de crypter des fichiers avec les bibliothèques de hash ?
    Par a028762 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 01/12/2006, 09h18

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