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 :

Comparer fichiers A et B, mettre à jour B


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 80
    Points : 57
    Points
    57
    Par défaut Comparer fichiers A et B, mettre à jour B
    Bonsoir,

    Malgré avoir parcouru la FAQ, j'ai du mal à écrire mon algorithme...

    Je dois parcourir un fichier A intégrant des n° de séries, vérifier s'ils existent dans un fichier B,
    et y ajouter uniquement ceux qui ne sont pas dans B (doublons interdits).

    J'ai essayé d'ouvrir directement les 2 fichiers, mais comme je dois lire et écrire simultanément
    dans le second... je coince.

    Comme vu sur le forum, j'ai alors chargé les 2 fichiers dans des tableaux, mais je me perds
    dans le traitement. Lorsqu'un n° de série n'existe pas, j'arrive à le créer, mais plusieurs fois !
    (il faudrait que le script recharge le fichier B pour réactualiser les derniers enregistrement, mais
    cela ne me semble pas optimisé du tout !)

    Pourriez-vous m'aiguiller sur la méthode à appliquer (tableaux ?) et m'aider à bâtir le script ?

    D'avance merci.

  2. #2
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 75
    Points : 160
    Points
    160
    Par défaut
    Pourquoi ne pas créer un fichier C, effacer B et renommer C en B ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 80
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par Seb_de_lille
    Pourquoi ne pas créer un fichier C, effacer B et renommer C en B ?
    Le fichier B ne peut être effacé car il doit être disponible e continu.
    J'essaie donc de le mettre à jour le plus "proprement" possible,
    en y ajoutant uniquement les n° de série inconnus.

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ma supposition est que tu es le seul à écrire dans ce fichier B (que d'autres personnes peuvent lire en même temps) ? Si ce n'est pas le cas, tu n'es pas au bout de tes misères, et il y a d'autres points à considérer.

    Voici ce que je ferais si ma supposition est correcte :

    Ouvrir B en lecture.
    Lire B et mettre les numéro de série dans un hash %num_in_B en tant que clés.
    Fermer B.

    Ouvrir A en lecture.
    Lire A et mettre les numéros de série qui ne sont pas dans B (vérifier avec exists() ) dans un autre hash %num_to_add.
    Fermer A.

    Ouvrir B en addition (mode '>>').
    Ecrire les keys de %num_to_add en une seule écriture (autrement dit un seul print).
    Fermer B.

    Dis-nous si tu y arrives mieux avec ça.
    --
    Jedaï

  5. #5
    Membre habitué Avatar de spirit_epock
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 153
    Points : 173
    Points
    173
    Par défaut
    La réponse de Jedai est digne d'un maitre Yoda.

    Mais avec les tableaux, tu pouvais en creer

    my @tab_A = <FILE_A>;
    my @tab_B = <FILE_B>;

    Ensuite tu boucles en en faisant un foreach de @tab_B
    Puis tu inclus une deuxieme boucle foreach de @tab_A
    Et avec ton scalaire tu vérifies chaque ligne. Si inexistant tu ouvres ton fichier FILE_B et tu écris ">>" l'élément manquant.

    open FILE_B, ">> $ton_fichier"
    print FILE_B $ta_ligne."\n";
    close (FILE_B);

    Voila,
    a+
    L'opposé du jeu n'est pas le sérieux mais la réalité.
    Sigmund Freud

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 80
    Points : 57
    Points
    57
    Par défaut
    Désolé pour ma réponse tardive...
    Grâce à votre aide, voici le code que j'ai écris, et qui fonctionne correctement.
    => Je passe le post en résolu.

    Le code n'est pas très élégant, mais je n'ai pas encore osé mettre le nez
    dans les "hash".
    => Vos commentaires sont les bienvenus.


    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
     
    open (F1, "< $File1") || die print "Pb to open file";
    open (F2, "< $File2") || die print "Pb to open file";
    my @tab1 = <F1>; 
    my @tab2 = <F2>; 
    close F1; close F2;
    my $line1; my $line2; 
    my $variable; my $deja_vu;
    my $Qty = 0; 
    # Analyser chaque ligne du fichier1
    foreach $line1(@tab1) 
     { 
     # Ne traiter que les sn qui commencent par V...
     if ( $line1 =~ /^V/ ) 
       {
      chomp($line1); substr($line1,0,11)="";  # Isoler les sn (suppression préfixe "V") 
       print "\nfile1 : $line1\n";
      $deja_vu = 0;
      foreach  $line2 (@tab2)    # Parcourir chaque ligne du fichier2
       {
       if ( $line2 =~ /^V/ ) 
           {
        $variable = $line2;
        chomp($variable);
         substr($variable,0,13)=""; # Isoler  le sn (suppression préfixe "V")
         if ($variable eq $line1)
           {
            $deja_vu = 1;
         print "       sn : $variable - $deja_vu\n";
           }
           }
       }
            if ($deja_vu == 0)
            { 
         print "      new sn : $line1";
           print `echo $line1 >> $File`;
         $Qty++;
            }
        else
            { 
         print "      new sn : non";
            }
       print "\n";
       }  
     }
    print "\n____________________________________________\n\n";
    print `cat $File`;
    print "\nAdded $AesQty new \"sn\" \n";
    print "\n";
    }

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ma réponse donnait un truc comme ça :
    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
    52
     
    #! /usr/bin/perl
    use strict; use warnings;
     
    my ($fileA, $fileB) = @ARGV[0..1];
     
    # quels sn sont dans B ?
    open my $old_nums_handle, '<', $fileB
          or die print "Pb to open $fileB : $!\n";
     
    my %old_nums;
    while( <$old_nums_handle> ){
        if( m/^V/ ){
            chomp();
            my $old_sn = substr $_, 13;
            $old_nums{$old_sn} = 1;
        }
    }
     
    close $old_nums_handle
        or die "Can't close $fileB : $!\n";
     
     
     
    # quels sn de A ne sont pas dans B ?
    open my $new_nums_handle, '<', $fileA
          or die print "Pb to open $fileA : $!\n";
     
    my @new_nums;
    while( <$new_nums_handle> ){
        if( m/^V/ ){
            chomp();
            my $new_sn = substr $_, 11;
            push @new_nums, $new_sn if not exists $old_nums{$new_sn};
        }
    }
     
    close $new_nums_handle
        or die "Can't close $fileA : $!\n";
     
     
    # écriture finale :
    open my $final_output_handle, '>>', $fileB
        or die "Pb to open $fileB to add the new nums : $!\n";
     
    print $final_output_handle '$_\n'
        foreach (@new_nums);
     
    close $final_output_handle
        or die "Can't close $fileB after adding new nums : $!\n";
     
    __END__
    Mais tu n'as pas l'air de faire exactement ce que tu nous disais vouloir faire ? Tu ne rajoute pas tes numéros au fichier B ($File2 dans ton code) mais à un troisième fichier ? Par ailleurs il semblerait que les numéros dans les fichiers A et B soit précédés d'un préfixe que tu ne mets pas dans ce troisième fichier ?

    --
    Jedaï

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

Discussions similaires

  1. [Toutes versions] Comparer 2 fichiers et mettre à jour un fichier par rapport à l'autre
    Par Pleyel dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 15/05/2020, 14h18
  2. Comparer 2 tables et les mettre à jour
    Par Phyl dans le forum VBA Access
    Réponses: 10
    Dernier message: 22/03/2012, 21h26
  3. mettre à jour un fichier
    Par ibtisss dans le forum Langage
    Réponses: 1
    Dernier message: 02/02/2006, 10h50
  4. Prb mettre à jour une table via un fichier excel
    Par antier dans le forum Access
    Réponses: 3
    Dernier message: 02/12/2005, 10h31

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