Fichiers texte en perl

bezoindaidde Messages postés 3 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
slt tout le monde, je cherche à écrire un scrip en perl, qui me permet de comparer le contenu de deux fichiers textes (de grande taille), en associant à chaque fichier un tableau, ou bien en passant par les tables de hachage.c ma premièe conception des choses. mais je m'en sors tjrs pas. je vous remercie.
Configuration: Windows XP
Internet Explorer 6.0

4 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    On peut travailler avec de tables de hachages (hash) et tableau quand il s'agit de petits fichiers
    En revanche quand on traite des gros fichiers il faut penser à la mémoire disponible

    Voilà un exemple
    J'ai 2 fichiers dont un est l'autre à l'envers. Ce qui veut dire que les fichiers ne sont pas identiques.

    Dans le 1er script je n'utilise pas de tableaux, en revanche j'utilise de handles de fichiers dans lequels je vais écrire les différences si c'est le cas sinon je vais afficher un messsage
    Le script
    $ cat comparefic2.pl
    #!/usr/bin/perl
    #
    use strict;use warnings;
    
    # ouverture de fichiers en lecture
    open F_LIRE1,"fic1" or die "E/S : $!\n";
    open F_LIRE2,"fic2" or die "E/S : $!\n";
    
    open F_A,">>fic1diff" or die "E/S : $!\n";
    open F_B,">>fic2diff" or die "E/S : $!\n";
    
    # $f1 lit les ligne dans le 1er fichier
    # $f2 dans le 2ème
    my ($f1,$f2);
    my $i=0;
    
    # lecture des fichiers ligne par ligne
    # avant de paser à la ligne suivante on compare les lignes
    # si les lignes ne sont pas identiques
    # j'écris dans les fichiers correspondants
    while ( defined($f1=<F_LIRE1>) and defined($f2=<F_LIRE2>) ){
      chomp($f1); # suppression de caractère de fin de ligne
      chomp($f2);
    
      ( (print F_A "$f1\n"),
        (print F_B "$f2\n"),
         ++$i               )unless $f1 eq $f2;
    }
    
    if ($i == 0){
      print "Les fichiers sont identiques.\n";
      unlink <fic*diff>;
    }else{
      print "Les fichiers ne sont pas identiques.\n";
      print "-fichier fic1diff :les lignes se trouvant que dans fic1\n";
      print "-fichier fic2diff :les lignes se trouvant que dans fic2\n";
    }
    __END__                               

    Dans le 2ème script je sauvegarde les differences dans 2 tableaux.
    Le script 2
    #!/usr/bin/perl
    #
    use strict;use warnings;
    
    # ouverture de fichiers en lecture
    open F_LIRE1,"fic1" or die "E/S : $!\n";
    open F_LIRE2,"fic2" or die "E/S : $!\n";
    
    
    # $f1 lit les ligne dans le 1er fichier
    # $f2 dans le 2ème
    my ($f1,$f2);
    
    # @A - tableau qui contiendra les lignes existantes que dans le 1er fichier
    # @B - que dans le 2ème fichier
    my (@A,@B);
    
    # lecture des fichiers ligne par ligne
    # avant de paser à la ligne suivante on compare les lignes
    # si les lignes ne sont pas identiques
    # $f1 est ajouté à @A et $f2 est ajouté à @B
    while ( defined($f1=<F_LIRE1>) and defined($f2=<F_LIRE2>) ){
      chomp($f1); # suppression de caractère de fin de ligne
      chomp($f2);
      ( (push @A,$f1),
        (push @B,$f2) ) unless $f1 eq $f2;
    }
    
    
    if ((@A+@B) ==0){ # si la somme des elements de @A et @B est 0
      print "Les fichiers sont identiques.\n";
    }else{
      print "Les fichiers ne sont pas identiques\n";
    }
    __END__
    
    Et voilà l'exécution (à étudier avec attention :-))
    Execution de 1er script (donc sans tableaux)
    lami20j@debian:~/trash$ time perl comparefic2.pl
    Les fichiers ne sont pas identiques.
    -fichier fic1diff :les lignes se trouvant que dans fic1
    -fichier fic2diff :les lignes se trouvant que dans fic2
    
    real    0m13.764s
    user    0m6.664s
    sys     0m1.140s
    
    Execution de 2ème script (j'ai du l'arrêter avec CTRL+C)
    lami20j@debian:~/trash$ time perl comparefic.pl
    Les fichiers ne sont pas identiques
    
    real    3m42.216s
    user    0m7.760s
    sys     0m2.036s
    
    Et voilà la taille et les nombre de lignes de chaque fichier
    lami20j@debian:~/trash$ du -h fic1
    54M     fic1
    lami20j@debian:~/trash$ du -h fic2
    54M     fic2
    lami20j@debian:~/trash$ du -h fic1diff
    53M     fic1diff
    lami20j@debian:~/trash$ du -h fic2diff
    53M     fic2diff
    lami20j@debian:~/trash$ cat fic1 | wc -l
    2184192
    lami20j@debian:~/trash$ cat fic2 | wc -l
    2184192
    lami20j@debian:~/trash$ cat fic1diff | wc -l
    2101248
    lami20j@debian:~/trash$ cat fic2diff | wc -l
    2101248
    
    A toi de voir
    1
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    j'ai besoin de tes fichiers (dans mon profil tu as mon mail)
    et aussi de ce que tu veux obtenir comme résultat

    - juste oui ou non
    - les éléments qui sont en A et ne sont pas en B
    - les éléments qui sont en B et ne sont pas en A
    etc.
    0
  3. bezoindaidde Messages postés 3 Statut Membre 1
     
    je veux voir si le contenu qui est dans le fichier A,est le même qui est dans le fichier B.
    autre possiblité: extraire ce qu'il y a en commun ds A et B, et, dans un autre fichier texte , ce qu'il y a dans l'un , et pas dans l'autre.
    bon c juste une idée.
    Pr l'exemple, tu peux prendre n'importe kel fichier texte(bcp de lignes, c tout).
    merci
    1
  4. bezoindaidde Messages postés 3 Statut Membre 1
     
    si on y intègre la notion des tables de hachage, ca serait bien.
    i'm a débutant en perl!
    0