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 fichier


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 14
    Points : 6
    Points
    6
    Par défaut Comparaison de fichier
    Bonjour,

    Je suis actuellement en stage et l'on me demande d'écrire un script en perl pouvant faire la comparaison entre 2 fichier à jour J et jour J-1.
    D'en ressortir les différences pour prevenir l'admin d'une éventuelle modification de paramètre d'un individu (ex: date de sortie prorogé) ou d'ajout complet d'une personne.

    Les fichiers sont de format txt sous la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Matricule;Sexe;Nom;Prenom;cf;libCF;Date sortie
    0072583;MR;MOUGIN;PAUL;011;CARTERS;30;
    0075350;MR;GENTILS;PATRICK;011;CARTERS;32;
    etc...
    Apres avoir chercher sur le forum j'ai fait un premier jet qui ne fonctionne pas (et d'ailleurs qui ne prend pas en compte tout les desirata) en effet il n'arrive pas à comparer chaque valeur entre ";" de chaque fichier avec l'autre.
    Pour faire un essai j'essaye juste de comparer les differentes date de sortie


    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
    #!C:\Perl\bin\perl.exe 
     
    use strict;
     
    my @tab=();
    my $file="e:/fc.txt";
     
    print "ouverture du fichier Jour J\n";
    open(my $fd, $file) or die "$file : $!";
     
    foreach my $line(<$fd>) {
        chomp($line);
    my @datas=split(";", $line);
        print $datas[6]."\n"
    }
    system "pause \n";
     
    close($fd);
     
    print "ouverture du fichier Jour J-1\n",
     
    my @tab1=();
     
    my $file="e:/fc1.txt";
    open(my $fd, $file) or die "$file : $!";
    foreach my $line(<$fd>) {
            chomp($line);
      my @datas1=split(";", $line);
        print $datas1[6]."\n"
    }
    system "pause \n";
     
    close($fd);
     
    print "comparaison des 2 fichiers\n";
     
    system "pause \n";
     
    if (@tab != @tab1){print "Il y a eu ajout d'utilisateur \n";} 
    else {print "Pas d'ajout dans la base de donnee\n";}
     
    system "pause \n";
     
    if ( $tab[6] != $tab1[6] || $tab[6] ne $tab1[6] ){print "Il y a une modification de la date de sortie \n";} 
     
    else {print "Pas de modification de la date de sortie\n";}
     
    system "pause \n";
    Et depuis je me casse les dents dessus, toutes aides seraient la bienvenue.
    merci d'avance

    [Edit]
    Balises [ code ] et [ /code ] ajoutées par 2Eurocents.
    Merci d'y penser pour améliorer la lisibilité du forum
    [/Edit]

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Salut

    En fait, tes tableaux sont toujours écrasés ce qui n'est pas commode.
    Je suis plutôt passé par les tables de hachages avec le script suivant :
    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
     
    #!/usr/bin/perl
     
    use strict;
     
    my %datas;
    my $file="fc.txt";
     
    print "ouverture du fichier Jour J\n";
    open(FILE, $file) or die "$file : $!";
    my $i=0;
    while(my $line = <FILE>) {
        chomp($line);
        $datas{$i++} = $line;
    }
    close(FILE);
     
    print "ouverture du fichier Jour J-1\n",
     
    my %datas1=();
    my $file="fc1.txt";
    $i=0;
    open(FILE, $file) or die "$file : $!";
    while(my $line = <FILE>) {
            chomp($line);
    	$datas1{$i++} = $line;
    }
    close(FILE);
     
    print "comparaison des 2 fichiers\n";
     
    print "Comparaisons des tailles :\n";
    my $size_datas = scalar(keys(%datas));
    my $size_datas1 = scalar(keys(%datas1));
    if($size_datas != $size_datas1){
    	print"Il y a $size_datas-$size_datas1 utilisateur(s) à rajouter.\n";
    }
     
    print "Comparaisons des dates de sortie.\n";
    foreach my $elem (keys(%datas)){
    	my @datas = split(";", $datas{$elem});
    	my @datas1 = split(";", $datas1{$elem});
    	if ($datas[6] != $datas1[6]){
    		print "Date de sortie à modifier pour $datas[0].\n";
    	}
    }
    Et cela marche pour les fichiers suivants :
    Citation Envoyé par fc.txt
    Matricule;Sexe;Nom;Prenom;cf;libCF;Date sortie
    0072583;MR;MOUGIN;PAUL;011;CARTERS;31;
    0075350;MR;GENTILS;PATRICK;011;CARTERS;32;
    Citation Envoyé par fc1.txt
    Matricule;Sexe;Nom;Prenom;cf;libCF;Date sortie
    0072583;MR;MOUGIN;PAUL;011;CARTERS;30;
    0075350;MR;GENTILS;PATRICK;011;CARTERS;32;
    @++

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Merci c'est nickel apres l'avoir testé (avec quelques adaptation)

    Pourrais je savoir à quoi correspond :
    pour en être sur.

    Et est 'il possible à la suite de ça de sortir directement la ligne qui à été rajoutée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    print "Comparaisons des tailles :\n"; 
    my $size_datas = scalar(keys(%datas)); 
    my $size_datas1 = scalar(keys(%datas1)); 
    if($size_datas != $size_datas1){ 
    	my $diff = ($size_datas1-$size_datas);
         	print"Il y a $diff utilisateur(s) a rajouter.\n"; 
    }
    En tout cas merci encore de m'avoir retiré cette épine du pied

  4. #4
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Salut

    Avec la fonction keys(%hash_table), je récupère un tableau qui contient toutes les clés de ma table associative. Comme c'est un tableau et que je veux obtenir sa taille, j'utilise après scalar pour mettre cette liste en contexte scalaire et donc récupérer ni plus ni moins que sa taille.
    Cocnernant le code que tu proposes, j'y vois aucune objection si ça peut te paraître plus clair.
    Si c'est OK, n'oublies pas de mettre le tag Résolu sur ton thread

    Au plaisir de t'avoir aidé.

    @++

  5. #5
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    L'explication est clair

    Il me manque plus que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Et est 'il possible à la suite de ça de sortir directement la ligne qui a été rajoutée.
    [/code]

  6. #6
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Ah, excuses-moi, apparemment je n'ai pas les yeux en face des trous !
    Ouais, ça doit se faire, tu veux juste extraire la ligne surnuméraire ? Dans ce cas, on va partir du principe que le fichier modifié est fc.txt et que l'on ajoute un nouveau personnage en "append" (à la suite du fichier. Tout à l'heure, on a vu que les clés de notre table de hash sont des nombres (en fait, le numéro de ligne commençant par 0). Donc, si on a la différence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    print "Comparaisons des tailles :\n";
    my $size_datas = scalar(keys(%datas));
    my $size_datas1 = scalar(keys(%datas1));
    if($size_datas != $size_datas1){
       my $diff = ($size_datas1-$size_datas);
            print"Il y a $diff utilisateur(s) a rajouter.\n";
    } 
     
    for ($i=$size_datas1; $i<$size_datas1+$diff; $i++){
    print "Nouvel élément : $datas{$i}\n";
    }
    Attention ! Code non testé (je sais je suis une grosse larve !). L'idée est de partir de la table de hash modifiée avec comme élément de départ, le dernier élément (ie la clé) de notre table non modifiée. On s'arrêtera à l'élément+la différence.

    @++

  7. #7
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    En un mot : PARFAIT
    Merci encore

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

Discussions similaires

  1. Comparaison de fichiers text
    Par mick84m dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 22/07/2005, 17h48
  2. [Debutant(e)]comparaison de fichier : imprimer
    Par demostene dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 06/07/2004, 11h43
  3. Comparaison de fichiers Word
    Par Zelphalya dans le forum Langage
    Réponses: 5
    Dernier message: 20/10/2003, 16h15
  4. [langage] Comparaison de fichiers
    Par Jibees dans le forum Langage
    Réponses: 3
    Dernier message: 23/04/2003, 17h27
  5. Comparaison de fichier
    Par danzerg dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2003, 12h49

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