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 :

[langage] comparer fichier


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2002
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 43
    Points : 38
    Points
    38
    Par défaut [langage] comparer fichier
    j'aimerais pouvoir comparer 2 fichiers en perl
    et comparer leur nombre de lignes

    merci

  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Je la fais courte. 8)

    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
     
    open (FIC1 , "fic1.txt") || die "Probleme d'ouverture: $!";
    open (FIC2 , "fic2.txt") || die "Probleme d'ouverture: $!";
     
    my @lignes1=<FIC1>;
    my @lignes2=<FIC2>;
     
    close FIC1; 
    close FIC2; 
     
    die "Nombre de lignes différent" if (@lignes1 != @lignes2);
     
    chomp (@lignes1);
    chomp (@lignes2);
     
    for (my $i = 0 ; $i < @lignes1 ; $i++) {
      if ($lignes1[i] ne $lignes2[i]) {
        print "Ligne $i < $lignes1[i]\n";
        print "Ligne $i > $lignes2[i]\n";
      }
    }
    je n'ai pas testé, mais l'idée y est ...
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2002
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    tu ouvres les 2 fichiers
    tu met dans un tableau chaque ligne des 2 fichiers
    tu compares ces 2 tableaux
    si identique alors pas de modif sinon modif
    mais il me faudrait le nbr de ligne de chacun des fichiers pour compatrer si nouvelle ligne
    pourquoi chomp
    et que veut dire ne dans if $ligne ne $ligne2

    est ce que le script suivant est correct
    open(fic,'Diff fichie_old fichie_new');
    my @line_diff=<fic>
    foreach(@line_diff)
    {
    @champ=split(/;/,$_);
    et la j'ai tous les champs de ma ligne dans un tableaux
    je compare dans ma table si nouvel ligne ou si la cle primaire existe deja et en fonction insert ou update

  4. #4
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par pascal.cargouet
    tu ouvres les 2 fichiers
    tu met dans un tableau chaque ligne des 2 fichiers
    Jusque la, oui ...
    Citation Envoyé par pascal.cargouet
    tu compares ces 2 tableaux
    Non, je compare leur nombre de lignes ...
    Citation Envoyé par pascal.cargouet
    si identique alors pas de modif sinon modif
    mais il me faudrait le nbr de ligne de chacun des fichiers pour compatrer si nouvelle ligne
    le nombre d'élément d'un tableau, c'est @nom_tableau (évalué en contexte numérique, c'est à dire quand l'interpreteur Perl s'attend à rencontrer un nombre, en gros).
    Citation Envoyé par pascal.cargouet
    pourquoi chomp
    Pourquoi pas
    Pour rallonger la réponse que je trouvais trop courte
    Pour virer les retours à la ligne récupérés dans le tableau ... C'est un habitude que j'ai quand je récupère des lignes de fichier.
    Citation Envoyé par pascal.cargouet
    et que veut dire ne dans if $ligne ne $ligne2
    ne = not equal
    Comparaison "lexicographique" (eq, ne, lt, gt, le, ge, cmp) par opposition à la comparaison numérique (==, !=, <, >, <=, >=, <=>). Il faut y faire attention, quand on compare des chaines. C'est une cause fréquente de comportement indéfini ...
    Citation Envoyé par pascal.cargouet
    est ce que le script suivant est correct
    open(fic,'Diff fichie_old fichie_new');
    my @line_diff=<fic>
    foreach(@line_diff)
    {
    @champ=split(/;/,$_);
    et la j'ai tous les champs de ma ligne dans un tableaux
    je compare dans ma table si nouvel ligne ou si la cle primaire existe deja et en fonction insert ou update
    diff, avec un d minuscule ...
    La commande lancée par open doit se terminer par un pipe ("|" = barre verticale) si tu veux récupérer sa sortie.
    Le lancement de commande par un script rend souvent celui-ci dépendant de l'OS ...
    Ensuite, à toi de voir le traitement, en fonction des résultats de diff, qu'il faut analyser finement (présence d'un > ou d'un < pour savoir quel fichier est impacté, nombre de lignes de différences, plages de suppressions de lignes, etc.)
    La commande diff est très riche, tu verras
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2002
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    en fait voila l'algo que je veux traduire en perl
    j'ai 2fichier csv correspondant a des donnes dans des tables un fichier_old et un fichier_new sachant que les lignes ne sont pas forcement remonter dans le meme ordre
    c'est a dire que je peux avoir
    tot;tata
    azert;trez

    et dans fichier new
    tot;tata
    tertt;nefxdfdf >>> ici nouvelle ligne
    azert;trez

    la il y a une nouvelle ligne

    voila l'algo
    si fichier new different fichier old et nbr de ligne different
    alors nouvelle element (nouvelle ligne) + eventuel modif dans ligne
    donc on lit toutes les lignes
    on recuopere la cle primaire
    si la cle primaire existe dans ma table alors pas de nouvel element donc modification donc on update la table

    si la cle n'existe pas alors nouvel element donc insert dans la table et on historise

    si fichier new different de fichier old et nbr ligne identique
    alors juste modification
    on update

  6. #6
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Bonjour,


    Tu parles de base de données : si j'étais toi je chargerais tous dans des tables temporaires sur lesquelles je travaillerais avec les requêtes SQL ad hoc pour voir s'il s'agit de nouvel enregistrement, d'enregistrements modifés...


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2002
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    la problematique est que je recoit un fichier new donc pour savoir si une nouvelle donne a ete rentre ou s'il y a eu des modif le + simple comme j'ai ce fichier est de le comparer a l'ancien fichier_old

    est ce que le script suivant est correct
    open(fic,'| diff fichie_old fichie_new');
    my @line_diff=<fic>
    comment ne prendre que les ligne de fichie_new?
    comment distingue les lignes modifie des lignes nouvelles

    foreach(@line_diff)
    {
    @champ=split(/;/,$_);
    }

  8. #8
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Slt tlm !

    Heuuu... pour se contenter de comparer le nb de lignes de 2 fichiers, il peut être intéressant d'utiliser la commande suivante :
    my $res1 = `cat fichier1 | wc`;
    my $res2 = `cat fichier2 | wc`;

    Un petit coup de split pour séparer le contenu des $res et le tour est joué.

    @+
    Mr6

  9. #9
    Nouveau membre du Club
    Inscrit en
    Septembre 2002
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    oui mais comment faire pour comparer 2 fichiers dire s'ils sont identiques ou pas?

  10. #10
    Nouveau membre du Club
    Inscrit en
    Septembre 2002
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    open(fic_compare,"| diff $fichier_new $fichier_old");
    my @line_fic_compare=<fic_compare>;
    print "\n\n compare= $line_fic_compare[0]";
    mes fichier sont differents mais $line_fic_compare[0] est vide alors que ma comande diff m'affiche des lignes

    ?????
    merci

  11. #11
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Tu n'es pas facile à suivre, quand tu cross-postes ...

    J'ai répondu sur ton autre fil ...
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

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

Discussions similaires

  1. [quel langage] sauvegarder fichier dont l'url est connu
    Par azerty_essai dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 28/03/2005, 12h14
  2. Réponses: 4
    Dernier message: 24/08/2004, 13h54
  3. [langage] 2 fichier dans 1 en evitant les doublons
    Par remixxl dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2004, 17h05
  4. [langage] path fichier
    Par louisis dans le forum Langage
    Réponses: 3
    Dernier message: 13/07/2004, 10h43
  5. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52

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