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 deux fichiers


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut Comparaison de deux fichiers
    Bonjour

    J'aimerais pouvoir comparé deux fichiers pour en générer un troisième
    Exemple d'une ligne du premier fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IMAGE w3xxc1p8 0 0 9 w3xxc1p8_1379498434 CL-cristaldrW4-ALOG 0 *NULL* root SCH-cristaldrW4-ALOG-R0 2 0 1379498434 139 1380103234 0 0 16384 5 1 1 0 CL-cristaldrW4-ALOG_1379498434_UBAK.f *NULL* *NULL* 0 1 0 0 0 *NULL* 0 0 0 0 0 0 0 *NULL* 0 0 0 *NULL* 3093320 0 0 1347 0 0 FC5B8C461DD111B28C520021288EEC50 *NULL* 0 0 0
    Ce qui m’intéresse c'est le 7eme et le 11eme champ
    Exemple d'une ligne du second
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SCH-cristaldrW4-ALOG-R0 0 DDR-O-V2C-R0 CL-cristaldrW4-ALOG
    je recherche ces deux champs dans le deuxième fichier.
    Qui correspond au quatrième et premier champ du second
    Je reprend la ligne complète du 1er fichier et j'ajoute l'information du troisième champ du second
    Resultat attendu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IMAGE w3xxc1p8 0 0 9 w3xxc1p8_1379498434 CL-cristaldrW4-ALOG 0 *NULL* root SCH-cristaldrW4-ALOG-R0 2 0 1379498434 139 1380103234 0 0 16384 5 1 1 0 CL-cristaldrW4-ALOG_1379498434_UBAK.f *NULL* *NULL* 0 1 0 0 0 *NULL* 0 0 0 0 0 0 0 *NULL* 0 0 0 *NULL* 3093320 0 0 1347 0 0 FC5B8C461DD111B28C520021288EEC50 *NULL* 0 0 0 DDR-O-V2C-R0
    D'avance merci pour vos éclaircissements
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    est ce que les informations de ton fichier sont triées?

    dans le même ordre, sur le même numéro de ligne dans les 2 fichiers, aléatoires...

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Même question: les fichiers sont-ils triée, ou peuvent-ils l'être avant de commencer le traitement.

    Seconde question: quelle est la taille du second fichier (nombre de lignes)? La question sous-jacente étant: les données qui nous intéressent dans le second fichier peuvent-elles tenir en mémoire dans un hash (ou un hash de hash)? Si oui, c'est certainement la solution: lire le second fichier et stocker les données qui nous intéressent en mémoire, puis lire le premier fichier et chercher les champs nous intéressant dans le hash en mémoire.

  4. #4
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut
    Bonjour

    Le deuxième fichier est effectivement trié sur le premier champ et le nombre de champ ne varie pas. En théorie, la taille maximum environ 1 Mo. Le 1er fichier lui il n'est pas trié,le nombre de champ est variable mais les champs qui permettent de faire la comparaison (le septième et onzième) ne bougent jamais.
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Comme l'a dit @Lolo il serait pas mal de passer par un hash

    Je pense que si tu fais :
    - chargement dans un hash de hash du second fichier dont la clé est le 1er champs et en valeur les 2 informations dont tu as besoin (champs 3 et 4)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ex: hash = (  $Champs4_fic2 => ( 'Champs_11_Fic1'=>$Champs4_fic2,
                                     'Champs_a_ajouter'=>$Champs3_fic2)
              )

    - tu parcours ton fichier 1 dans lequel tu recherches les 2 champs souhaités que tu peux traiter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ligne =~ s/[\n\r]+$//;
    foreach my $cle ( keys(%hash) ){
         if ( $ligne =~ /(.*)$cle(.*)$hash{$cle}{'Champs_11_Fic1'}(.*)/ ){
              $ligne .= "[sep]$hash{$cle}{'Champs_a_ajouter'}[FINLIGNE]";
              print FIC3_OUT $ligne;
              last;
         }
    }
    [sep] sera à remplacer par le séparateur utilisé dans le fichier 1: espace ou tabulation (\t)
    [FINLIGNE] dépend de ton système: Unix (\n), Windows (\r\n), Mac (\r)

    voilà les pistes mais n'hésite pas à revenir si tu as des questions ou que ton code ne fonctionne pas

  6. #6
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut
    Merci @6ril23 et @Lolo pour votre aide.
    je vais voir ce que je peux faire avec cela.
    Et je vous tiendrais au courant dés que j'aurais pu avancer.
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  7. #7
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Cyril a bien expliqué l'idée que j'avais en tête. N'hésite pas à poster tes essais si tu rencontres des difficultés.

  8. #8
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut
    Pour être franc, j'ai beaucoup de mal à comprendre le hash de hash
    Si j'ai bien tout compris
    j'ouvre mon fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open (fic2,'<',$fic2) or die "impossible d'ouvrir $fic2\n";
    Ensuite je décompose mes champs avec la commande split
    Et je récupère les champs 3 et 4 (pour perl champ 2 et3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my @champ=split;
    my $champs4_fic2=$champ[3];
    my $champs3_fic2=$champ[2];
    Par contre, je ne comprends pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    hash = ( $Champs4_fic2 => ( 'Champs_11_Fic1'=>$Champs4_fic2,
                                'Champs_a_ajouter'=>$Champs3_fic2)
              )
    La variable hash doit être déclarée comment ?
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par JUSTIN Loïc Voir le message
    Pour être franc, j'ai beaucoup de mal à comprendre le hash de hash
    Si j'ai bien tout compris
    j'ouvre mon fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open (fic2,'<',$fic2) or die "impossible d'ouvrir $fic2\n";
    Ensuite je décompose mes champs avec la commande split
    Et je récupère les champs 3 et 4 (pour perl champ 2 et3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @champ=split;
    my $champs1_fic2=$champ[0];
    my $champs4_fic2=$champ[3];
    my $champs3_fic2=$champ[2];
    oui comme ça ça va fonctionner, sinon tu peux faire avec une expression régulière

    Citation Envoyé par JUSTIN Loïc Voir le message
    Par contre, je ne comprends pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    hash = ( $Champs4_fic2 => ( 'Champs_11_Fic1'=>$Champs4_fic2,
                                'Champs_a_ajouter'=>$Champs3_fic2)
              )
    La variable hash doit être déclarée comment ?
    pour définir ton hash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my %hash_fichier2;
    $hash_fichier2{$champs1_fic2}{'Champs_11_Fic1'}   = $Champs4_fic2;
    $hash_fichier2{$champs1_fic2}{'Champs_a_ajouter'} = $Champs3_fic2;
    ou directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my %hash_fichier2;
    $hash_fichier2{$champ[0]}{'Champs_11_Fic1'}   = $champ[3];
    $hash_fichier2{$champ[0]}{'Champs_a_ajouter'} = $champ[2];

  10. #10
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut
    voici la suite de mes recherches
    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
    #!/usr/bin/perl
    use strict;
     
    my $fic1="fichier1";
    my $fic2="fichier2";
    open (fic2,'<',$fic2) or die "impossible d'ouvrir $fic2\n";
    while (<fic2>)
    {
    my @champ=split;
    my $Champs1_fic2=$champ[0];
    my $Champs4_fic2=$champ[3];
    my $Champs3_fic2=$champ[2];
    my %hash_fichier2;
    $hash_fichier2{$Champs1_fic2}{'Champs_11_Fic1'} = $Champs4_fic2;
    $hash_fichier2{$Champs1_fic2}{'Champs_a_ajouter'} = $Champs3_fic2;
    }
    close fic2;
    open (fic1,'<',$fic1) or die "impossible d'ouvrir $fic2\n";
    while (<fic1>)
    {
    my @ligne = split;
    my $Champs_11_Fic1=$ligne[10];
    foreach my $cle ( keys(%hash_fichier2) ){
         if ( $ligne =~ /(.*)$cle(.*)$hash_fichier2{$Champs1_fic2}{'Champs_11_Fic1'}(.*)/ ){
              $ligne .= " $hash_fichier2{$Champs1_fic2}{'Champs_a_ajouter'}\n";
              print "$ligne\n";
              last;
         }
    }
    }
    La deuxieme partie ne fonctionne pas
    Je m'explique
    j'ouvre le fichier 1
    je le décompose avec la commande split
    je récupére le 11eme champ
    Puis j'utilise la clé de hachage pour la comparaison.
    Si on pouvait me donner une piste. Je serais bien content.
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par JUSTIN Loïc Voir le message
    voici la suite de mes recherches
    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
    #!/usr/bin/perl
    use strict;
    
    my $fic1="fichier1";
    my $fic2="fichier2";
    open (fic2,'<',$fic2) or die "impossible d'ouvrir $fic2\n";
    while (<fic2>)
    {
    $_ =~ /[\r\n]+$//;         #sinon lors de la comparaison ça ne matchera jamais 
    my @champ=split;
    my $Champs1_fic2=$champ[0];
    my $Champs4_fic2=$champ[3];
    my $Champs3_fic2=$champ[2];
    my %hash_fichier2;
    $hash_fichier2{$Champs1_fic2}{'Champs_11_Fic1'} = $Champs4_fic2;
    $hash_fichier2{$Champs1_fic2}{'Champs_a_ajouter'} = $Champs3_fic2;
    }
    close fic2;
    open (fic1,'<',$fic1) or die "impossible d'ouvrir $fic2\n";
    while (<fic1>)
    {
    my $ligne = $_;
    $ligne = ~ /[\r\n]+$//;
    #my @ligne = split;
    #my $Champs_11_Fic1=$ligne[10];
    foreach my $cle ( keys(%hash_fichier2) ){
         if ( $ligne =~ /(.*)$cle(.*)$hash_fichier2{$cle}{'Champs_11_Fic1'}(.*)/ ){
              $ligne .= " $hash_fichier2{$cle}{'Champs_a_ajouter'}\n";
              print "$ligne\n";
              last;
         }
    }
    }
    La deuxieme partie ne fonctionne pas
    Je m'explique
    j'ouvre le fichier 1
    je le décompose avec la commande split
    je récupére le 11eme champ
    Puis j'utilise la clé de hachage pour la comparaison.
    Si on pouvait me donner une piste. Je serais bien content.
    essaie le code comme ça (en rouge ce qui a été changé)
    le code ainsi ne va pas si tu peux avoir les 2 expressions que tu recherche dans d'autres colonnes: en clair, je recherche juste les 2 mots sur une même ligne sans tenir compte de la colonne

    PS: évite de dire "ça ne fonctionne pas" car on ne peut pas deviner ce que ça veut dire mais plutôt "voilà ce que j'ai comme message d'erreur/ voilà le résultat alors que j'attendais cela..."

  12. #12
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut
    Merci pour ton aide @6ril23
    Effectivement tu as raison, dire que cela ne fonctionne pas ne fait pas avancer le "schmilblick"

    Quand je lance le script
    j'ai un message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -bash-2.05b$ ./essai1.pl
    syntax error at ./essai1.pl line 9, near "/;"
    syntax error at ./essai1.pl line 23, near "/;"
    Execution of ./essai1.pl aborted due to compilation errors.
    Si j'essaie de supprimer le deuxieme /
    j'ai ce nouveau message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    -bash-2.05b$ ./essai1.pl
    Global symbol "%hash_fichier2" requires explicit package name at ./essai1.pl line 24.
    Global symbol "%hash_fichier2" requires explicit package name at ./essai1.pl line 26.
    Global symbol "%hash_fichier2" requires explicit package name at ./essai1.pl line 27.
    Execution of ./essai1.pl aborted due to compilation errors.
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  13. #13
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par JUSTIN Loïc Voir le message
    Merci pour ton aide @6ril23
    mais quand je lance le script
    j'ai un message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -bash-2.05b$ ./essai1.pl
    syntax error at ./essai1.pl line 9, near "/;"
    syntax error at ./essai1.pl line 23, near "/;"
    Execution of ./essai1.pl aborted due to compilation errors.
    la ligne 9 devient
    c'est la même erreur ligne 23

  14. #14
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut
    Mea culpa.

    Je n'ai même pas vu que c’était une substitution

    Une fois les modifications effectuées, j'ai le deuxième message d'erreur qui apparait concernant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Global symbol "%hash_fichier2" requires explicit package name at ./essai1.pl
    Pour les lignes 24 26 et 27
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    oui excuse moi j'ai pas écrit la correction.
    il suffit de déplacer la ligne 14 : "my %hash_fichier2;" avant le "while" ligne 7


    Car vu que la variable est définie dans la boucle, sa portée est limitée à celle-ci alors que si tu la définie en dehors de la boucle tu pourras t'en servir partout


    quand tu as ce message, c'est que tu n'as pas défini une variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Global symbol "XXX" requires explicit package name

  16. #16
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut
    Effectivement c’était bien cela.
    Cela fonctionne correctement.
    Il me reste plus qu'à envoyer le résultat dans un fichier
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  17. #17
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Si tout fonctionne pense à mettre la discussion

  18. #18
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut
    Je confirme cela fonctionne très bien.
    Voici le script définitif
    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
    #!/usr/bin/perl
    use strict;
     
    my $fic1="/tmp/fichier1";
    my $fic2="/tmp/fichier2";
    my $fic3_out="/tmp/fichier3_out";
    open (fic2,'<',$fic2) or die "impossible d'ouvrir $fic2\n";
    my %hash_fichier2;
    while (<fic2>)
    {
    $_ =~ s/[\r\n]+$//;
    my @champ=split;
    my $Champs1_fic2=$champ[0];
    my $Champs4_fic2=$champ[3];
    my $Champs3_fic2=$champ[2];
     
    $hash_fichier2{$Champs1_fic2}{'Champs_11_Fic1'} = $Champs4_fic2;
    $hash_fichier2{$Champs1_fic2}{'Champs_a_ajouter'} = $Champs3_fic2;
    }
    close fic2;
    open (fic1,'<',$fic1) or die "impossible d'ouvrir $fic2\n";
    open (fic3_out,'>',$fic3_out) or die "impossible d'ecrire $fic3_out\n";
    while (<fic1>)
    {
    my $ligne = $_;
    $ligne =~ s/[\r\n]+$//;
    foreach my $cle ( keys(%hash_fichier2) ){
         if ( $ligne =~ /(.*)$cle(.*)$hash_fichier2{$cle}{'Champs_11_Fic1'}(.*)/ ){
              $ligne .= " $hash_fichier2{$cle}{'Champs_a_ajouter'}\n";
              print fic3_out "$ligne";
              last;
         }
      }
    }
    close fic1;
    close fic3_out;
    Si il y a des erreurs ou des améliorations je suis preneur.
    Sinon, un grand merci à @6ril23
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  19. #19
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut
    Je viens d'enlever RESOLU
    Car, je viens de me rendre compte que cela ne fonctionne pas dans certains cas.Voir exemple ci-dessous
    SCH-NBU-APPLI-CR1 DDR-O-V2A-R1 CL-NBU-APPLI
    SCH-NBU-APPLI-CR1 DDR-B-V2A-R1 CL-NBU-APPLI6
    Donc la clé ne doit plus se faire uniquement sur le premier champ mais aussi sur le troisieme
    Consequence, il manque des informations
    > IMAGE opnbuvm1 0 0 9 opnbuvm1_1380798000 CL-NBU-APPLI 0 *NULL* root SCH-NBU-APPLI-CR1 4 1 1380798000 572 1382007600 0 0 15618624 109751 1 1 0 CL-NBU-APPLI_1380798000_INCR.f *NULL* *NULL* 0 1 0 0 0 *NULL* 0 0 0 0 0 0 0 *NULL* 0 0 0 *NULL* 3150178 0 0 13416433 0 0 *NULL* *NULL* 0 0 0 DDR-O-V2A-R1
    5535a5537
    > IMAGE opnbuvm1 0 0 9 opnbuvm1_1380711600 CL-NBU-APPLI 0 *NULL* root SCH-NBU-APPLI-CR1 4 1 1380711600 447 1381921200 0 0 12875008 71642 1 1 0 CL-NBU-APPLI_1380711600_INCR.f *NULL* *NULL* 0 1 0 0 0 *NULL* 0 0 0 0 0 0 0 *NULL* 0 0 0 *NULL* 3146463 0 0 8746370 0 0 *NULL* *NULL* 0 0 0 DDR-O-V2A-R1
    Comment procéder ?
    Ps: On perd un point quand on supprime un état RESOLU
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  20. #20
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Tu peux construire un hash simple avec une clé composite formée en assemblant les premier et quatrième champs du second fichier avec un séparateur arbitraire (j'ai pris '#' ci-dessous, il vaut mieux prendre un caractère qui ne figure pas dans les fichiers ).

    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
    # fusion.pl
    use strict;
    use warnings;
     
    my $fname2 = shift;
    die "usage: $0 <fic2> [<fic1>]" unless defined $fname2;
     
    my $sep = q{#};
    my %h2 =
        map { s/[\r\n]*$//; my @f = split; "$f[0]$sep$f[3]" => $f[2] }
        do { local (@ARGV) = $fname2; <> };
    while (<>) {
        s/[\r\n]*$//; # safe chomp for @ARGV
        my @f = split;
        my $key = "$f[10]$sep$f[6]";
        exists $h2{$key} and print $_, " ", $h2{$key}, "\n";
    }
    Ça marche pour ton premier exemple, je ne suis pas certain de comprendre le problème avec le second. Attention, le 'second' fichier est passé en premier sur la ligne de commande.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Taisha:~/tttmp/comparaison_de_deux_fichiers $ cat f1a
    IMAGE w3xxc1p8 0 0 9 w3xxc1p8_1379498434 CL-cristaldrW4-ALOG 0 *NULL* root SCH-cristaldrW4-ALOG-R0 2 0 1379498434 139 1380103234 0 0 16384 5 1 1 0 CL-cristaldrW4-ALOG_1379498434_UBAK.f *NULL* *NULL* 0 1 0 0 0 *NULL* 0 0 0 0 0 0 0 *NULL* 0 0 0 *NULL* 3093320 0 0 1347 0 0 FC5B8C461DD111B28C520021288EEC50 *NULL* 0 0 0
    Taisha:~/tttmp/comparaison_de_deux_fichiers $ cat f2a
    SCH-cristaldrW4-ALOG-R0 0 DDR-O-V2C-R0 CL-cristaldrW4-ALOG
    Taisha:~/tttmp/comparaison_de_deux_fichiers $ cat f3a
    IMAGE w3xxc1p8 0 0 9 w3xxc1p8_1379498434 CL-cristaldrW4-ALOG 0 *NULL* root SCH-cristaldrW4-ALOG-R0 2 0 1379498434 139 1380103234 0 0 16384 5 1 1 0 CL-cristaldrW4-ALOG_1379498434_UBAK.f *NULL* *NULL* 0 1 0 0 0 *NULL* 0 0 0 0 0 0 0 *NULL* 0 0 0 *NULL* 3093320 0 0 1347 0 0 FC5B8C461DD111B28C520021288EEC50 *NULL* 0 0 0 DDR-O-V2C-R0
    Taisha:~/tttmp/comparaison_de_deux_fichiers $ perl fusion.pl f2a f1a | diff - f3a
    Taisha:~/tttmp/comparaison_de_deux_fichiers $
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Comparaison de deux fichiers Excel
    Par Fab_lux dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/08/2007, 21h41
  2. comparaison de deux fichiers
    Par john123 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 17/03/2007, 16h38
  3. Comparaison de deux fichiers EXCEL
    Par meufeu dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/10/2006, 22h56
  4. comparaison de deux fichiers textes
    Par chmaichel dans le forum Delphi
    Réponses: 1
    Dernier message: 28/07/2006, 11h35
  5. [langage] Comparaison de deux fichiers
    Par perlgirl dans le forum Langage
    Réponses: 4
    Dernier message: 04/05/2005, 16h05

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