Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1125 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  comparaison de 2 fichiers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

comparaison de 2 fichiers

n°2268172
Henri772
Posté le 20-10-2015 à 22:38:55  profilanswer
 

Salut a tous j'ai besoin de votre aide je possede 2 fichiers que j'aimerai comparer en voila les fichiers.
 
-----------------------DATA1.csv-----------------------------
 
20150616 22:16:09
default,ame_a, ame_m, ame_uc, ame_f, ams_l,affi,
 
default,        , fault,        col,     fault,   fac,      1,  
 
 
---------------------DATA2.csv-----------------------------------
 
20150616 22:16:09
                       true,  false,     true,      false,     true,   true,
 
        default, ame_a, ame_m, ame_uc, ame_f, ams_l,  affi,
 
 true DPA01,  fault,    fault,     fault,      fault,    fault,     1,
 
false DPA02,       ,     n_5,           ,              ,    fault,     1,
 
false DPA03,  fault,   fault,       olt,          col,    fault,    1,
 
false DPA04,  fault,     at,       fault,          2,     fault,    1,
 
 
 
Le script doit comparer les valeurs des paramètres de DATA1.csv avec les valeurs des paramètres de DATA2.csv , et écrire les résultats dans un fichier.
 
comme  premier paramètre de DATA1.csv nous ame_a ce qui a les valeurs vide, puis le script va dans DATA2.csv regarde  la colonne avec pour paramètre de nom  ame_a si au dessus du paramètre il ya "true", le script s'arrete ,
va au paramètre suivant dans DATA1.csv savoir ame_m ce qui a de la valeur "fault" va ensuit dans le DATA2.csv recherches la colonne avec  le paramètre de nom ame_m, ce paramètre a "false" en dessus ca veut dire cette colonne doit etre examine, celui si consiste a retrouver tous les noms des systemes donc les valeurs de parametre serons different de "fault", dans ce cas, serait
 
ame_m: fault
DPA02: N_5
DPA04: at
 
procède ensuite au  troisième paramètre dans DATA1.csv avec pour nom  ame_uc , celui ci a la valeur de "col", puis va dans DATA2.csv  ce paramètre est marque en dessus avec "true", ca veut dire que la colenne ne doit pas d'être vérifié.
puis aller au quatrième paramètre dans DATA1.csv celui ci a pour nom  ame_f avec les valeurs "fault" passe ensuite au DATA2.csv cherches la colonne avec pour paramètre ame_f, en dessus la paramater est marque "false", cette colonne doit etre vérifié , puis comme je l'ai déjà explique plus haut , il me donne le nom des systèmes donc les valeurs ne sont pas «fault», dans le cas precis ce sera  
sont, dans ce cas, serait
 
ame_f: fault
DPA02:
DPA03: col
DPA04: 2
 
donc pour ce cas le script devrai me retourner juste 2 fichiers de sortie  
 
------ame_m-----------------
ame_m: fault
DPA02: N_5
DPA04: at
 
------ame_f------------------
ame_f: fault
DPA02:
DPA03: col
DPA04: 2
 

mood
Publicité
Posté le 20-10-2015 à 22:38:55  profilanswer
 

n°2268312
Henri772
Posté le 22-10-2015 à 18:14:56  profilanswer
 

Personne ici ne peut m'aider ?

n°2268314
rat de com​bat
attention rongeur méchant!
Posté le 22-10-2015 à 18:55:08  profilanswer
 

Je ne peux parler que pour moi: Désolé, mais on ne fait pas ton boulot à ta place... gilou t'a fait plus d'un script déjà, à un moment faudra bien y arriver tout seul. En plus tes explications ne sont pas forcément claires. Pour le problème présent je n'ai pas regardé en détail mais ça n'a pas l'air magique, soit tu prends un module tout fait pour le csv (il y en a certainement), soit tu fais à la main avec du split() et/ou du Regex. Une fois que tu as tes données en mémoire (avec une structure convenable) les comparaisons diverses ne devraient pas poser de problème. Fais donc le début et propose nous un code à améliorer/corriger!


Message édité par rat de combat le 22-10-2015 à 19:44:38
n°2268319
Henri772
Posté le 22-10-2015 à 20:03:28  profilanswer
 

je l'avou Gilou m'a beaucoup aide, pour cela je le remerci infiniment, je ne suis pas un etre ingrat,
bon je publie ce que j'ai car il ne fontionne pas du tout.
par ailleur si quelque chose n'est pas clair je peu me reexpliquer


Message édité par Henri772 le 22-10-2015 à 20:05:36
n°2268338
gilou
Modérateur
Modzilla
Posté le 22-10-2015 à 23:35:01  profilanswer
 

Bon, j'ai pondu un truc vite fait:

Code :
  1. #!/usr/bin/perl
  2. use Modern::Perl;
  3.  
  4.  
  5. sub parse_paramfile($) {
  6.  my ($args) = @_;
  7.  my $file = $args->{filename};
  8.  
  9.  if (open(my $handle, '<', $file)) {
  10.    my $line = 0;
  11.    my @fields;
  12.    while (<$handle> ) {
  13.      s/\s*\n//;
  14.      next if (/^\s*\d{8}\s\d{2}:\d{2}:\d{2}\s*$/);
  15.      next if (/^\s*$/);
  16.      $fields[$line++] = [split(/,/, $_)];
  17.    }
  18.    close($handle);
  19.    if ($line < 2) {
  20.      return (1, "File $file has not enough lines", undef);
  21.    } elsif ($line > 2) {
  22.      return (1, "File $file has too manylines", undef);
  23.    }
  24.    map {s/^\s+|\s+$//o;} @{$fields[0]};
  25.    map {s/^\s+|\s+$//o;} @{$fields[1]};
  26.    if (@{$fields[0]} != @{$fields[1]}) {
  27.      return (1, "File $file has not a fixed number of fields", undef);
  28.    }
  29.    if (($fields[0]->[0] ne "default" ) or ($fields[1]->[0] ne "default" )) {
  30.      return (1, "File $file has not first fields as default", undef);
  31.    }
  32.    shift @{$fields[0]};
  33.    shift @{$fields[1]};
  34.    my %param;
  35.    for my $i (0..$#{$fields[0]}) {
  36.      $param{$fields[0]->[$i]} = $fields[1]->[$i];
  37.    }
  38.    return (0, undef, \%param);
  39.  } else {
  40.    return (1, "Cannot open file $file", undef);
  41.  }
  42. }
  43.  
  44. sub parse_datafile($) {
  45.  my ($args) = @_;
  46.  my $file = $args->{filename};
  47.  
  48.  if (open(my $handle, '<', $file)) {
  49.    my $line = 0;
  50.    my @fields;
  51.    while (<$handle> ) {
  52.      s/\s*\n//;
  53.      next if (/^\s*\d{8}\s\d{2}:\d{2}:\d{2}\s*$/);
  54.      next if (/^\s*$/);
  55.      $fields[$line++] = [split(/,/, $_)];
  56.    }
  57.    close($handle);
  58.    if ($line < 2) {
  59.      return (1, "File $file has not enough lines", undef);
  60.    }
  61.    for my $i (0..$#fields) {
  62.      map {s/^\s+|\s+$//o;} @{$fields[$i]};
  63.    }
  64.    my $nbfields = 0 + @{$fields[0]};
  65.    for my $i (1..$#fields) {
  66.      if ($#{$fields[$i]} != $nbfields) {
  67.        return (1, "File $file has not a fixed number of fields", undef);
  68.      }
  69.    }
  70.    unshift(@{$fields[0]}, "dummy" );
  71.    foreach my $i (1..$nbfields) {
  72.      if ($fields[0]->[$i] !~ /^(true|false)$/ ) {
  73.        return (1, "Line with other values than true or false at start of file $file", undef);
  74.      }
  75.    }
  76.    if ($fields[1]->[0] !~ /^default$/ ) {
  77.      return (1, "Header line does not start starts with \"default\" in file $file", undef);
  78.    }
  79.    for my $i (2..$#fields) {
  80.      if ($fields[$i]->[0] !~ /^(true|false)\s/ ) {
  81.        return (1, "Line starts with \"$fields[$i]->[0]\" in file $file", undef);
  82.      }
  83.      $fields[$i]->[0] =~ s/^(true|false)\s+//;
  84.    }
  85.    my %data;
  86.    for my $i (1..$nbfields) {
  87.      next if ($fields[0]->[$i] eq "true" );
  88.      for my $j (2..$#fields) {
  89.        unless ($data{$fields[1]->[$i]}) {
  90.          $data{$fields[1]->[$i]} = [];
  91.        }
  92.        push @{$data{$fields[1]->[$i]}}, [$fields[$j]->[0], $fields[$j]->[$i]];
  93.      }
  94.    }
  95.    return (0, undef, \%data);
  96.  } else {
  97.    return (1, "Cannot open file $file", undef);
  98.  }
  99. }
  100.  
  101.  
  102. my $file1 = 'DATA1.csv';
  103. my $file2 = 'DATA2.csv';
  104.  
  105. my ($errcode, $errtext, $param, $data);
  106.  
  107. ($errcode, $errtext, $param) = parse_paramfile({filename =>$file1});
  108. if ($errcode) {
  109.  print "ERROR: $errtext !";
  110.  exit(1);
  111. }
  112.  
  113. ($errcode, $errtext, $data) = parse_datafile({filename =>$file2});
  114. if ($errcode) {
  115.  print "ERROR: $errtext !";
  116.  exit(1);
  117. }
  118.  
  119. for my $k (keys %{$data}) {
  120.  print "----$k----\n";
  121.  print "$k: $param->{$k}\n";
  122.  for my $i (0.. $#{$data->{$k}}) {
  123.    if ($param->{$k} ne $data->{$k}->[$i]->[1]) {
  124.      print "$data->{$k}->[$i]->[0]: $data->{$k}->[$i]->[1]\n";
  125.    }
  126.  }
  127.  print "\n";
  128. }


Avec tes données, ça m'imprime à la console ceci:

----ame_f----
ame_f: fault
DPA02:
DPA03: col
DPA04: 2
 
----ame_m----
ame_m: fault
DPA02: n_5
DPA04: at


A priori, il devrait bien tourner, mais c'est sans garantie, je te laisse le soin de l'adapter à tes besoins et de corriger les erreurs s'il y en a.
Au niveau de la ligne 118, tu peux rajouter ceci:
use Data::Dumper;
print Dumper($param), "\n\n", Dumper($data), "\n";
si tu veux visualiser à la console les structures des (références à des) hash en sortie du parsing des fichiers.
 
A+,


Message édité par gilou le 22-10-2015 à 23:46:07

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2268381
Henri772
Posté le 24-10-2015 à 11:55:06  profilanswer
 

grand Merci bien Gilou,
je vois a l'instant ta Proposition je vais devoir pouvoir modifier si le faut tres grand merci.
je vais me permettre de pouvoir de damnder si il ya des lignes donc je ne comprend pas.
a+

n°2269400
Henri772
Posté le 09-11-2015 à 22:49:29  profilanswer
 

Henri772 a écrit :

grand Merci bien Gilou,
je vois a l'instant ta Proposition je vais devoir pouvoir modifier si le faut tres grand merci.
je vais me permettre de pouvoir de damnder si il ya des lignes donc je ne comprend pas.
a+


 
Salut Gilou  
comme je disais une fois j'ai quelque questions concerne le script, je vais devoir encore te derranger une fois de plus. Merci bien de ton aide.
 
 il est necessaire de traiter les fichiers avec toute ses if-conditions?
 
ligne  
16
24
25
29
32
33
35
36
61
62
85
86
87
88
89
90
91
92
93
94
95
107
113

n°2269425
gilou
Modérateur
Modzilla
Posté le 10-11-2015 à 14:25:51  profilanswer
 

C'est à cause de la n-ième loi de Murphy informatique:
Quand un fichier doit avoir un format précis, il ne l'aura pas.
Il faut donc en tenir compte et prévoir tous les cas de figure en input, si on ne veut pas que le script fasse des choses inattendues quand il rencontre des situations imprévues.
 
A+,


Message édité par gilou le 10-11-2015 à 14:26:46

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  comparaison de 2 fichiers

 

Sujets relatifs
Aide VBA comparaison de deux fichiers Excel[VBA] comparaison de 2 fichiers excel
Comparaison et calculs sur deux fichiers à la foiscomparaison de fichiers
problème de comparaison de deux fichiers[VBS] Comparaison de dates (résolu)
Comparaison de deux fichiers[Résolu] Comparaison Groupe de Fichiers
[Python]Comparaison de fichiers[VBS] : comparaison de fichiers (ligne par ligne)
Plus de sujets relatifs à : comparaison de 2 fichiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR