comparaison de 2 fichiers

comparaison de 2 fichiers - Perl - Programmation

Marsh Posté le 20-10-2015 à 22:38:55    

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
 

Reply

Marsh Posté le 20-10-2015 à 22:38:55   

Reply

Marsh Posté le 22-10-2015 à 18:14:56    

Personne ici ne peut m'aider ?

Reply

Marsh Posté le 22-10-2015 à 18:55:08    

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
Reply

Marsh Posté le 22-10-2015 à 20:03:28    

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
Reply

Marsh Posté le 22-10-2015 à 23:35:01    

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é!  --
Reply

Marsh Posté le 24-10-2015 à 11:55:06    

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+

Reply

Marsh Posté le 09-11-2015 à 22:49:29    

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

Reply

Marsh Posté le 10-11-2015 à 14:25:51    

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é!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed