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 :

help script perl comparaison de deux fichiers


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Par défaut help script perl comparaison de deux fichiers
    Bonjour je dois faire un script pour comparer deux fichier et je ne sais pas vraiment comment mi prendre..

    fic1 du style

    test robert anna jaques cyril
    sb001 aa bb cc aa
    sb002 aa cc bb uu
    sb003 aa uu cc bb

    fic 2 du style

    test anais roberta jaques nicolas
    sb002 aa cc -- uu
    sb008 aa cc bb uu
    sb009 aa cc bb uu

    pour le -- c'est une donnée manquante

    en faite je dois comparer les deux fichiers

    en gros il doit ressortir un fichier3

    comme celui la

    test robert anna jaques cyril anais roberta nicolas
    sb001 aa bb cc aa -- -- --
    sb002 aa cc bb uu aa cc -- uu
    sb003 aa uu cc bb -- -- --
    sb008 -- -- bb -- aa cc uu
    sb009 -- --bb -- aa cc uu

    pour resumer le fichier 3
    on fusionne les données redondante exemple pour jaques qui est dans les deux fichiers
    et on fusionne les données pour les test redondant comme sb002 dans l'exemple

    merci si vous avez des pistes pour m'aider je rames...

  2. #2
    Membre expérimenté
    Avatar de magicshark
    Homme Profil pro
    Dans une SS2I donc pas que JAVA
    Inscrit en
    Octobre 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dans une SS2I donc pas que JAVA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 133
    Par défaut
    Voilà un début de piste
    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
    #!/usr/bin/perl -w
    use strict;
     
    #Les trois fichiers
    my $fic1 = "monfic1.extension";
    my $fic2 = "monfic2.extension";
    my $fic3 = "monfic3.extension";
     
    #Pour la lecture des lignes
    my $lign1;
    my $ligne2;
     
    #Pour la lecture du contenu des lignes
    my @contenu1;
    my @contenu2;
     
    #Pour l'ouverture des lignes
    open(FIC1,$fic1);
    open(FIC2,$fic2);
    open(FIC3,>$fic3)
     
    #Tant qu'il y a des lignes dans les fichiers
    while( defined( $ligne1 = <FIC1> && defined( $ligne2 = <FIC2> ))
    {
        @contenu1 = split(/\s/,ligne1);
        @contenu2 = split(/\s/,ligne2);
    }

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Par défaut re
    jusqu'a la y avais pas de probleme merci pour la syntaxe c'est pour la comparaison je sais pas comment mi prendre pour ensuite le coller d'un un fichier fic3..
    comparaison des lignes et des colonnes..

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Une autre approche qui permet de s'affranchir du fait (comme dans l'exemple), que chaque fichier doive posséder les mêmes lignes dans le même ordre pour être comparées une à une : cette approche rempli un tableau au fur et à mesure de la lecture du premier fichier, et stocke dans le même temps les clés (colonne 1) dans une table de hashage.
    Lors de la lecture du deuxième fichier (et des suivants si nécessaire), il complète le premier tableau avec des nouvelles lignes (si la clé n'existe pas), ou en ajoutant les nouvelles colonnes aux lignes déjà présentes.

    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
    use strict;
    use warnings;
    use feature qw(:5.10);
     
    sub load_table {
      my ($result_tabref, $result_keyref, $file) = @_;
     
      open my $TABLE, "<", $file or die "Can't open $file: $!";
      chomp(my $line = <$TABLE>);
      my ($test_key, @col_names) = split /\s+/, $line;
      if (!@$result_tabref) {
        # create the first row
        push @$result_tabref, [ $test_key, @col_names ];
      }
      else {
        # complete the first row
        push @{$result_tabref->[0]}, @col_names;
      }
     
      my $col_number = @{$result_tabref->[0]};
      while (defined($line = <$TABLE>)) {
        chomp $line;
        my ($test_key, @col_names) = split /\s+/, $line;
        if (exists $result_keyref->{$test_key}) {
          # complete an existing row
          my $row_index = $result_keyref->{$test_key};
          push @{$result_tabref->[$row_index]}, @col_names;
        }
        else {
          # create a list of missing column values (from the column number of the first row)
          my @missing_col = map "--", 1 .. ($col_number - 1 - @col_names);
          push @$result_tabref, [ $test_key, @missing_col, @col_names ];
          $result_keyref->{$test_key} = $#$result_tabref;
        }
      }
      # treat incomplete rows
      foreach my $row (grep @$_ != $col_number, @$result_tabref) {
        push @$row, map "--", 1 .. ($col_number - @$row);
      }
    }
     
    sub print_table {
      my ($tabref, $file) = @_;
     
      open my $OUT, ">", $file or die "Can't open $file: $!";
      say { $OUT } join " ", @$_ foreach @$tabref;
    }
     
    my (@table, %test_keys);
    load_table(\@table, \%test_keys, "fic1.txt");
    load_table(\@table, \%test_keys, "fic2.txt");
    print_table(\@table, "fic3.txt");

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Par défaut
    merci philou ca m'aide bcp de voir toute la syntaxe ca na pas supprimé les doublon sur la première ligne mais je vais essayer de comprendre pourquoi merci pour vos réponses

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Je n'avais pas vu qu'il y avait des colonnes redondantes... Il faudrait alors que tu spécifies comment dois se comporter le merge d'une colonne commune quand :
    - la valeur est absente des deux fichiers
    - l'une des deux valeurs est présente seulement
    - et surtout quand deux valeurs sont présentes (identiques ou différentes).

    Ca va compliquer un peu le traitement : au lieu d'utiliser une simple table de valeurs de colonnes par ligne, je verrais bien l'usage d'un hashage qui associe le nom de la colonne et sa valeur. D'un autre coté, ça simplifiera aussi le traitement des lignes absentes.

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2012
    Messages : 25
    Par défaut
    quand la valeur est absente on laisse la donnée avec --
    si l'un a la donnée et pas l'autre dans m3 on doit retrouver la donnée


    et voila ma question dans mon exemple
    quand une donnée est hétérozygote donc AB dans le fic 1
    et que dans le fichier 2 la donnée est homozygote c'est toujours l'homozygote qui doit etre dans m3

    comment faire dans le script?

Discussions similaires

  1. comparaison de deux fichiers textes avec un script python
    Par zekruss dans le forum Général Python
    Réponses: 1
    Dernier message: 10/11/2009, 05h52
  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