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 :

Script pour diff entre deux fichiers en plusieurs colonnes


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Par défaut Script pour diff entre deux fichiers en plusieurs colonnes
    Salut TLM

    je rentre au sujet, j'ai un Script qui dois me faire la différence entre deux colonnes, chacune de ses colonnes dans un fichier, donc sa sera la différence entre deux fichier basé sur une colonne de donné pareille

    utilisation :
    ./Script.pl file1.txt num_col_f1 separ_f1 file2.txt num_col_f2 separ_f2

    - quand les separateur separ & et separ 2 sont blanc, le Script marche, pour le cas où les deux sépar sont diférents de blanc, le Script ne marche pas,

    le Code :
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    
    #!/usr/bin/perl 
    
    # le Script est pour la différence entre deux fichiers de plusieurs colonnes
    
    use strict;
    
    sub usage () {
                  print STDERR "\nUsage: $0 file1.txt num_col_f1 sep_f1 file2.txt num_col_f2 sep_f2\n";
                  print STDERR "Version: 1.0\n";
                  exit(1);
                 }
    
    if ( (scalar @ARGV != 4) and (scalar @ARGV != 5) and (scalar @ARGV != 6) )  
                  {
                   print STDERR "Error: this script need 4 arguments if Separator-Column est un espace, 5 if separator is not space for one File, 6 arguments if two separator for the files\n";
                   usage();
                  }
    
    my %ALL;
    my %ALL2;
    my $i=0; my $j=0;
    my $nb_ligne1;
    my $nb_ligne2;
    my $nb_ligne3;
    my $nb_ligne4;
    my $val;
    my $num_col_f1;
    my $num_col_f2;
    my $num_col_f3;
    my $num_col_f4;
    my $sep_f1;
    my $sep_f2;
    my $sep_f3;
    my $sep_f4;
    my @tab;
    my @col_1;
    my @col_2;
    my @col_3;
    my @col_4;
    my $val_f1;
    my $val_f2;
    my $val_f3;
    my $val_f4;
    my $name_file1;
    my $name_file2;
    my $name_file3;
    my $name_file4;
    
    if ( (scalar @ARGV == 4) )  
    	{  
    	 open FILE1, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!";
         open FILE2, "< $ARGV[2]" or die "Can't open file $ARGV[2] $!"; 
         open FILE3, "< $ARGV[2]" or die "Can't open file $ARGV[2]: $!";
         open FILE4, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!"; 
    	 $name_file1 = $ARGV[0];
    	 $num_col_f1 = $ARGV[1] - 1;
    	 
    	 $name_file2 = $ARGV[2];
    	 $num_col_f2 = $ARGV[3] - 1;
         
    	 $name_file3 = $ARGV[2];
         $num_col_f3 = $ARGV[3] - 1;
    
    	 $name_file4 = $ARGV[0];
         $num_col_f4 = $ARGV[1] - 1;
         }
    if ( (scalar @ARGV == 5)  and ($ARGV[2] != /\s/) ) 
    	{
    	 open FILE1, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!";
         open FILE2, "< $ARGV[3]" or die "Can't open file $ARGV[3] $!"; 
         open FILE3, "< $ARGV[3]" or die "Can't open file $ARGV[3]: $!";
         open FILE4, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!"; 
    	 $name_file1 = $ARGV[0];
    	 $num_col_f1 = $ARGV[1] - 1;
         $sep_f1     = $ARGV[2];
    
    	 $name_file2 = $ARGV[3];
    	 $num_col_f2 = $ARGV[4] - 1;
         
    	 $name_file3 = $ARGV[3];
         $num_col_f3 = $ARGV[4] - 1;
    
    	 $name_file4 = $ARGV[0];
         $num_col_f4 = $ARGV[1] - 1;
    	 $sep_f4     = $ARGV[2];
         }
    if ( (scalar @ARGV == 5)  and ($ARGV[5] != /\s/) )  
    	{
    	 open FILE1, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!";
         open FILE2, "< $ARGV[2]" or die "Can't open file $ARGV[2] $!"; 
         open FILE3, "< $ARGV[2]" or die "Can't open file $ARGV[2]: $!";
         open FILE4, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!"; 
    	 $name_file1 = $ARGV[0];
    	 $num_col_f1 = $ARGV[1] - 1;
         
    	 $name_file2 = $ARGV[3];
    	 $num_col_f2 = $ARGV[4] - 1;
    	 $sep_f2     = $ARGV[5];
         
    	 $name_file3 = $ARGV[3];
         $num_col_f3 = $ARGV[4] - 1;
    	 $sep_f3     = $ARGV[5];
    
    	 $name_file4 = $ARGV[0];
         $num_col_f4 = $ARGV[1] - 1;
        }
    
    if  ( scalar @ARGV == 6 )
        {
    	 open FILE1, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!";
         open FILE2, "< $ARGV[3]" or die "Can't open file $ARGV[3]: $!"; 
         open FILE3, "< $ARGV[3]" or die "Can't open file $ARGV[3]: $!";
         open FILE4, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!"; 
    	 $name_file1 = $ARGV[0];
    	 $num_col_f1 = $ARGV[1] - 1;
    	 $sep_f1     = $ARGV[2];
         
    	 $name_file2 = $ARGV[3];
    	 $num_col_f2 = $ARGV[4] - 1;
    	 $sep_f2     = $ARGV[5];
         
    	 $name_file3 = $ARGV[3];
         $num_col_f3 = $ARGV[4] - 1;
    	 $sep_f3     = $ARGV[5];
    
    	 $name_file4 = $ARGV[0];
         $num_col_f4 = $ARGV[1] - 1;
    	 $sep_f4     = $ARGV[2];
    	}
    while ( <FILE1> )
    {   chomp;
        next if( $_ =~ m/^$/o );
        if ( scalar @ARGV == 4 ) { @col_1 = split; }
    	if ((scalar @ARGV == 5 ) and ($ARGV[2] != /\s/)) { @col_1 = split(/$sep_f1/, $_) }; 
        if ( scalar @ARGV == 6 ) { @col_1 = split(/$sep_f1/, $_)};
    	
    	$val_f1 = $col_1[$num_col_f1]; 
    	$i++; 
        $ALL{$val_f1} = $i;
    }
    while ( <FILE2> )
    {   chomp;
        next if( $_ =~ m/^$/o );
        if ( scalar @ARGV == 4 ) { @col_2 = split; }
    	if ((scalar @ARGV == 5 ) and ($ARGV[5] != /\s/)) { @col_2 = split(/$sep_f2/, $_) }; 
    	if ( scalar @ARGV == 6 ) { @col_2 = split(/$sep_f2/, $_)};
    	
        $val_f2 = $col_2[$num_col_f2];
    	if ( not defined $ALL{$val_f2} )
                    {
                      print STDERR "\n--->>>>> Valeur $val_f2 existe sur le fichier $name_file2, mais pas sur le fichier $name_file1 !!!\n";
    				 }                
    }
    print STDERR "\n--->>>>> and :\n";
    while ( <FILE3> )
    {   chomp;
        next if( $_ =~ m/^$/o );
        if ( scalar @ARGV == 4 ) { @col_3 = split; }
    	if ((scalar @ARGV == 5 ) and ($ARGV[5] != /\s/)) { @col_3 = split(/$sep_f3/, $_) }; 
    	if ( scalar @ARGV == 6 ) { @col_3 = split(/$sep_f3/, $_)};
    	
    	$val_f3 = $col_3[$num_col_f3]; 
        $j++; 
        $ALL2{$val_f3} = $j;
    }
    while ( <FILE4> )
    {   chomp;
        next if( $_ =~ m/^$/o );
        if ( scalar @ARGV == 4 ) { @col_4 = split; }
    	if ((scalar @ARGV == 5 ) and ($ARGV[2] != /\s/)) { @col_4 = split(/$sep_f4/, $_) }; 
        if ( scalar @ARGV == 6 ) { @col_4 = split(/$sep_f4/, $_) ;}; 
    	
        $val_f4 = $col_4[$num_col_f4];
    	if ( not defined $ALL2{$val_f4} ) 
                    { 
    				  print STDERR "\n--->>>>> Valeur $val_f4 existe sur le fichier $name_file4, mais pas sur le fichier $name_file3 !!!\n";
    				  }
    }
    
    close (FILE1);
    close (FILE2);
    close (FILE3);
    close (FILE4);
    exit(0);
    exemple, Fichier 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    603014,603014022375163
    603012,603012020080258
    603011,603011020013069
    603013,603013021826196
    603014,603014022035474
    603012,603012020175349
    603012,603012020175369
    603012,603012020175379
    fichier 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    603014022375163,6030140223
    603012020080257,6030120200
    603011020013069,6030110200
    603013021826196,6030130218
    603014022035474,6030140220
    603012020175348,6030120201
    Exécution et résultat :
    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
    $ ./diff_2files.pl source.txt 1 ',' sortie.txt 2 ','
    
     existe sur le fichier sortie.txt, mais pas sur le fichier source.txt !!!
    
     existe sur le fichier sortie.txt, mais pas sur le fichier source.txt !!!
    
     existe sur le fichier sortie.txt, mais pas sur le fichier source.txt !!!
    
     existe sur le fichier sortie.txt, mais pas sur le fichier source.txt !!!
    
     existe sur le fichier sortie.txt, mais pas sur le fichier source.txt !!!
    
     existe sur le fichier sortie.txt, mais pas sur le fichier source.txt !!!
    
     existe sur le fichier sortie.txt, mais pas sur le fichier source.txt !!!
    
     existe sur le fichier sortie.txt, mais pas sur le fichier source.txt !!!
    
    --->>>>> and :
    
    --->>>>> Valeur 603014022375163 existe sur le fichier source.txt, mais pas sur le fichier sortie.txt !!!
    
    --->>>>> Valeur 603012020080257 existe sur le fichier source.txt, mais pas sur le fichier sortie.txt !!!
    
    --->>>>> Valeur 603011020013069 existe sur le fichier source.txt, mais pas sur le fichier sortie.txt !!!
    
    --->>>>> Valeur 603013021826196 existe sur le fichier source.txt, mais pas sur le fichier sortie.txt !!!
    
    --->>>>> Valeur 603014022035474 existe sur le fichier source.txt, mais pas sur le fichier sortie.txt !!!
    
    --->>>>> Valeur 603012020175348 existe sur le fichier source.txt, mais pas sur le fichier sortie.txt !!!
    je trouve pas de solution, et désolé car le CODE du Script est trop long (pas au goût pure Perl, mais j'ai tout mis, lol

  2. #2
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut
    Déjà, pour simplifier ton script, tu peux éviter de vérifier à tout bout de champ ton nombre d'arguments. Tu peux te contenter de le vérifier une seule fois, et initialiser, selon les cas, tes variables $sep_f1 et $sep_f2 avec la valeur passée en argument ou avec \s. D'ailleurs, je te recommanderais de faire de ces deux variables des "objets regex", ou regex précompilées, au moyen de l'opérateur qr (voir la page de manuel perlop).

    Pour le reste, ben, j'ai un peu de mal à m'y retrouver dans ton script. Il lui manque au moins une trentaine de lignes de commentaires pour être compréhensible.

  3. #3
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    C'est très confus comme script.
    On peut récupérer différents nombres d'arguments
    file1.txt
    num_col_f1
    sep_f1
    file2.txt
    num_col_f2
    sep_f2

    Plutôt que de faire une série de if , tu peux utiliser des elsif.

    Passer les textes en argument n'est ce pas suffisant?
    Tu lis la première ligne du fichier à la recherche de son type séparateur et de ton nombre de colonnes. Ainsi tu n'as plus besoin de ta série de if testant le nombre d'arguments passer à ton script.
    Quelque chose de ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (($.==1) and ($ligne =~ /\w+(\s+)\w+/)){
           my $sep = $1;
           my @liste_mots = ($ligne =~ m/\b(\w+)\b/g);
           my $nbr_colonnes =  @liste_mots;
       }

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Par défaut
    je rectifie pour les commentaire, mais j'ai pas pigé sur la solution de JASMINE, je comprends pas pkoi mon Script n'a pas la coloration syntaxique pour qu'il soit lisible !!!

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    #!/usr/bin/perl 
     
    # le Script est pour la différence entre deux fichiers de plusieurs colonnes
     
    use strict;
     
    sub usage () {
                  print STDERR "\nUsage: $0 file1.txt num_col_f1 sep_f1 file2.txt num_col_f2 sep_f2\n";
                  print STDERR "Version: 1.0\n";
                  exit(1);
                 }
     
    if ( (scalar @ARGV != 4) and (scalar @ARGV != 5) and (scalar @ARGV != 6) )  
                  {
                   print STDERR "Error: this script need 4 arguments if Separator-Column est un espace, 5 if separator is not space for one File, 6 arguments if two separator for the files\n";
                   usage();
                  }
     
    ##
    ## déclaration des variables
    ##
     
    my %ALL; my %ALL2; my $i=0; my $j=0; my $nb_ligne1; my $nb_ligne2; my $nb_ligne3; my $nb_ligne4; 
    my $num_col_f1; my $num_col_f2; my $num_col_f3;  my $num_col_f4;
    my $sep_f1; my $sep_f2; my $sep_f3; my $sep_f4; my @tab; my @col_1; my @col_2; my @col_3; my @col_4;
    my $val_f1; my $val_f2; my $val_f3; my $val_f4; my $name_file1; my $name_file2; my $name_file3; my $name_file4;
     
    ##
    ## cas ./mon_Script.pl file1.txt num_col_f1 file2.txt num_col_f2  (c'est a dire le séparateur est un blanc pour fichier1 et fichier2)
    ##
    if ( (scalar @ARGV == 4) )  
    	{  
    	 open FILE1, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!";
             open FILE2, "< $ARGV[2]" or die "Can't open file $ARGV[2] $!"; 
             open FILE3, "< $ARGV[2]" or die "Can't open file $ARGV[2]: $!";
             open FILE4, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!"; 
    	 $name_file1 = $ARGV[0];
    	 $num_col_f1 = $ARGV[1] - 1;
     
    	 $name_file2 = $ARGV[2];
    	 $num_col_f2 = $ARGV[3] - 1;
     
    	 $name_file3 = $ARGV[2];
             $num_col_f3 = $ARGV[3] - 1;
     
    	 $name_file4 = $ARGV[0];
             $num_col_f4 = $ARGV[1] - 1;
         }
    ##
    ## cas ./mon_Script.pl file1.txt num_col_f1 sep_f1 file2.txt num_col_f2  (c'est a dire le séparateur est différent de blanc pour fichier1)
    ##
    if ( (scalar @ARGV == 5)  and ($ARGV[2] != /\s/) ) 
    	{
    	 open FILE1, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!";
             open FILE2, "< $ARGV[3]" or die "Can't open file $ARGV[3] $!"; 
             open FILE3, "< $ARGV[3]" or die "Can't open file $ARGV[3]: $!";
             open FILE4, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!"; 
    	 $name_file1 = $ARGV[0];
    	 $num_col_f1 = $ARGV[1] - 1;
             $sep_f1     = $ARGV[2];
     
    	 $name_file2 = $ARGV[3];
    	 $num_col_f2 = $ARGV[4] - 1;
     
    	 $name_file3 = $ARGV[3];
             $num_col_f3 = $ARGV[4] - 1;
     
    	 $name_file4 = $ARGV[0];
             $num_col_f4 = $ARGV[1] - 1;
    	 $sep_f4     = $ARGV[2];
         }
     
    ##
    ## cas ./mon_Script.pl file1.txt num_col_f1 file2.txt num_col_f2 sep_f2 (c'est a dire le séparateur est un blanc pour fichier1)
    ##
    if ( (scalar @ARGV == 5)  and ($ARGV[5] != /\s/) )  
    	{
    	 open FILE1, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!";
             open FILE2, "< $ARGV[2]" or die "Can't open file $ARGV[2] $!"; 
             open FILE3, "< $ARGV[2]" or die "Can't open file $ARGV[2]: $!";
             open FILE4, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!"; 
    	 $name_file1 = $ARGV[0];
    	 $num_col_f1 = $ARGV[1] - 1;
     
    	 $name_file2 = $ARGV[3];
    	 $num_col_f2 = $ARGV[4] - 1;
    	 $sep_f2     = $ARGV[5];
     
    	 $name_file3 = $ARGV[3];
             $num_col_f3 = $ARGV[4] - 1;
    	 $sep_f3     = $ARGV[5];
     
    	 $name_file4 = $ARGV[0];
             $num_col_f4 = $ARGV[1] - 1;
        }
    ##
    ## cas ./mon_Script.pl file1.txt num_col_f1 sep_f2 file2.txt num_col_f2 sep_f2 (c'est a dire le séparateur est est différent de blanc pour  les deux fichiers)
    ##
    if  ( scalar @ARGV == 6 )
        {
    	 open FILE1, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!";
             open FILE2, "< $ARGV[3]" or die "Can't open file $ARGV[3]: $!"; 
             open FILE3, "< $ARGV[3]" or die "Can't open file $ARGV[3]: $!";
             open FILE4, "< $ARGV[0]" or die "Can't open file $ARGV[0]: $!"; 
    	 $name_file1 = $ARGV[0];
    	 $num_col_f1 = $ARGV[1] - 1;
    	 $sep_f1     = $ARGV[2];
     
    	 $name_file2 = $ARGV[3];
    	 $num_col_f2 = $ARGV[4] - 1;
    	 $sep_f2     = $ARGV[5];
     
    	 $name_file3 = $ARGV[3];
             $num_col_f3 = $ARGV[4] - 1;
    	 $sep_f3     = $ARGV[5];
     
    	 $name_file4 = $ARGV[0];
             $num_col_f4 = $ARGV[1] - 1;
    	 $sep_f4     = $ARGV[2];
    	}
     
    ## sens du teste fichier1 -> fichier2
    ## mettre le contenu de la  colonne $num_col_f1 fichier1 dans un hash %ALL
    ##
    while ( <FILE1> )
    {   chomp;
        next if( $_ =~ m/^$/o ); # sauter les lignes vides
        if ( scalar @ARGV == 4 ) { @col_1 = split; }
        if ((scalar @ARGV == 5 ) and ($ARGV[2] != /\s/)) { @col_1 = split(/$sep_f1/, $_) }; 
        if ( scalar @ARGV == 6 ) { @col_1 = split(/$sep_f1/, $_)};
     
    	$val_f1 = $col_1[$num_col_f1]; # récupérer les valeurs de la colonne $num_col_f1 
    	$i++; 
        $ALL{$val_f1} = $i;
    }
    ## 
    ## testé le contenu de la colonne $num_col_f2 avec le hash %ALL en utilisant "not define"
    ##
    while ( <FILE2> )
    {   chomp;
        next if( $_ =~ m/^$/o ); # sauter les lignes vides
        if ( scalar @ARGV == 4 ) { @col_2 = split; }
        if ((scalar @ARGV == 5 ) and ($ARGV[5] != /\s/)) { @col_2 = split(/$sep_f2/, $_) }; 
        if ( scalar @ARGV == 6 ) { @col_2 = split(/$sep_f2/, $_)};
     
        $val_f2 = $col_2[$num_col_f2]; # récupérer les valeurs de la colonne $num_col_f2
    	if ( not defined $ALL{$val_f2} )
                    { # quand la valeur $val_f2 n'existe pas dans le hash %ALL
                      print STDERR "\n--->>>>> Valeur $val_f2 existe sur le fichier $name_file2, mais pas sur le fichier $name_file1 !!!\n";
    				 }                
    }
    # en inverse les choses, sens du teste fichier2 -> fichier1
    ## mettre le contenu de la  colonne $num_col_f3 fichier1 dans un hash %ALL2
    ##
     
    print STDERR "\n--->>>>> and :\n";
    while ( <FILE3> )
    {   chomp;
        next if( $_ =~ m/^$/o ); # sauter les lignes vides
        if ( scalar @ARGV == 4 ) { @col_3 = split; }
        if ((scalar @ARGV == 5 ) and ($ARGV[5] != /\s/)) { @col_3 = split(/$sep_f3/, $_) }; 
        if ( scalar @ARGV == 6 ) { @col_3 = split(/$sep_f3/, $_)};
     
    	$val_f3 = $col_3[$num_col_f3]; # récupérer les valeurs de la colonne $num_col_f3
        $j++; 
        $ALL2{$val_f3} = $j;
    }
    ## 
    ## testé le contenu de la colonne $num_col_f4 avec le hash %ALL2 en utilisant "not define"
    ##
    while ( <FILE4> )
    {   chomp;
        next if( $_ =~ m/^$/o ); # sauter les lignes vides
        if ( scalar @ARGV == 4 ) { @col_4 = split; }
        if ((scalar @ARGV == 5 ) and ($ARGV[2] != /\s/)) { @col_4 = split(/$sep_f4/, $_) }; 
        if ( scalar @ARGV == 6 ) { @col_4 = split(/$sep_f4/, $_) ;}; 
     
        $val_f4 = $col_4[$num_col_f4]; # récupérer les valeurs de la colonne $num_col_f4
    	if ( not defined $ALL2{$val_f4} ) 
                    { # quand la valeur $val_f4 n'existe pas dans le hash %ALL2
    				  print STDERR "\n--->>>>> Valeur $val_f4 existe sur le fichier $name_file4, mais pas sur le fichier $name_file3 !!!\n";
    				  }
    }
     
    close (FILE1);
    close (FILE2);
    close (FILE3);
    close (FILE4);
    exit(0);
    fichier 1 , exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    603014,603014022375163
    603012,603012020080258
    603011,603011020013069
    603013,603013021826196
    603014,603014022035474
    603012,603012020175349
    603012,603012020175369
    603012,603012020175379
    
    fichier 2, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    603014022375163,6030140223
    603012020080257,6030120200
    603011020013069,6030110200
    603013021826196,6030130218
    603014022035474,6030140220
    603012020175348,6030120201
    
    le résultat dois être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    la valeur 603012020080258 existe sur fichier 1 et non pas sur fichier 2
    la valeur 603012020175349 existe sur fichier 1 et non pas sur fichier 2
    la valeur 603012020175379 existe sur fichier 1 et non pas sur fichier 2
    and
    la valeur 603012020080257 existe sur fichier 2 et non pas sur fichier 1
    la valeur 603012020175348 existe sur fichier 2 et non pas sur fichier 1
    voila en gros

    pour moi, ca marché quand les deux fichiers on un blanc comme séparateur de colonnes, mais avec des séparateurs comme le , ou ,' ou "," ...., le résultat est non pas le bon

  5. #5
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    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
    my (%liste_fich1, %liste_fich2);
     
    open (FICH1, $file1) or die;
    my $ligne;
    while ($ligne = <FICH1>){
    if ($ligne =~ /\d+/){
           my @liste_nbr = ($ligne =~ m/(\d+)/g); # récupère les deux nombres (fonctionne également si plus de 2 valeurs sur la ligne)
           map{$liste_fich1{$_} = 1;} @liste_nbr ;
       }
    }
    close(FICH1);
     
    open (FICH2, $file2) or die;
    my $ligne;
    while ($ligne = <FICH2>){
    if ($ligne =~ /\d+/){
           my @liste_nbr = ($ligne =~ m/(\d+)/g); # récupère les deux nombres (fonctionne également si plus de 2 valeurs sur la ligne)
           map{$liste_fich2{$_} = 1;} @liste_nbr;
       }
    }
    close(FICH2);
     
    # %liste_fich1 contient comme clés toutes les valeurs retrouvées dans fichier1
    # %liste_fich2 contient comme clés toutes les valeurs retrouvées dans fichier2
    # parcours des 2 hash afin de récupérer les valeurs communes et celles différentes 
    # if(exists $liste_fich2{$key_fich1}){print "la valeur $key_fich1 existe dans les 2 fichiers\n";}
    Enfin, c'est une autre façon de procéder qui me parait mieux. Je ne l'ai pas testée, il y a peut-être une erreur.


    Je ne vois pas ce qui cloche avec la virgule le split(",", $_) devrait fonctionner

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Par défaut
    Re,

    Desolé Jasmine, mais ton Script n'a rien donné comme résult, pourtant j'ai fait le not exist et j'ai rajouté le else,

    pour mon Script, le prob réside qu'avec le séparateur,

    quand j'ai enlevé le sérapareur (,) le Script a donné les bonne résult,

    mais quand j'insère le séparateur (,), le résultat est mauvais

    voila, je sais pas pkoi ca coince avec les séparateurs

    ( je sais que j'ai fait trop de if et tout, mais l'essentiel qu'il marche, puis je vais E essayé de l'optimisai au sens pure Perl,

    pkoi le prob est avec les séparateurs !!!!

    sinon, je peux faire un chgt du séparateur avec un blanc des le début

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Par défaut
    ah je voit bien maintenant

    c'est Jasmine qui mas donné une idée sur la solution a travers son sujet sur les éditeurs de texte,

    moi je travaille avec EditPlus sous Windows, et j'exécute le Script avec Cygwin,

    j'ai utilisé l'editeur PSPad, en utilisant directement le format UNIX,

    j'ai remis mes fichiers avec des séparateurs (n'importe lesquels) et ca s'est bien fonctionné

    donc mon Script est correct (je vais optimisé pour les if), mais si qlq'un a une idée pour l'optimiser plus, il sera le bienvenue,

    voila que c'est Résolu,

    merci pour TLM.

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

Discussions similaires

  1. [PowerShell] Script pour basculer entre deux types de connexions / Adresse Ip
    Par GADENSEB dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 17/06/2014, 18h18
  2. Equivalent recherchev, sous vba, entre deux fichiers et avec plusieurs critères
    Par Gallinettechouette dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 29/07/2013, 13h01
  3. [XL-2003] lien hypertext : chemin absolu pour une copie de celulle entre deux fichier
    Par leprechaun dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 07/07/2009, 14h20
  4. Variable entre deux fichiers java script
    Par Canard64 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/05/2008, 15h58
  5. Réponses: 4
    Dernier message: 16/04/2008, 11h12

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