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

  FORUM HardWare.fr
  Programmation
  Perl

  compare 2 fichiers (lignes et colonnes)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

compare 2 fichiers (lignes et colonnes)

n°2263441
Henri772
Posté le 28-07-2015 à 16:12:15  profilanswer
 

Salut a tous je me torture depuis un certains nombres de jours au sujet de 2 figiers que j'aimerai comparer.(lignes=h et colonne=v)
 
voici un exemple des fichier a compare
 
----------------------------------------------------------DATAo.csv--------------------------------------------------------------------------------------
 
20150714 00:08:49
default, ame_a, ame_m, ame_uc, ame_f, ams_l, enced_affi,
 
DPA01,  fault,    fault,       fault,      fault,    fault,   1,
 
DPA02,       ,           ,             ,            ,    fault,   1,
 
DPA03,  fault,    fault,          olt,     fault,    fault,   1,
 
DPA01, fault,        at,        fault,          2,    fault,   1,
 
le second DATA n'a que deux lignes
 
-----------------------------------------------------------------------------DATA1.csv-------------------------------------------------------------------
 
20150616 22:16:09
default, ame_a, ame_m, ame_uc, ame_f, ams_l, enced_affi,
 
default,  fault,     fault,      fault,      fault,    fault,    1,
 
comparaison par ligne=h (c'est ce que mon code effectue jusqu'ici)
 
le code doit aller dans le DATA1.csv il saute les 2 premieres ligne a saoit la date et les parametres, et prend la derniere ligne a savoir   fault,     fault,      fault,      fault,    fault,    1, et laissant le nom "default" lorsqu'il a cette ligne il va dans le fichier DATA0.csv la debute il la comparaison en laissant biensur les 2 premiere lignes (date et parametres)
 
ligne 1 il lasse tombe le nom du systeme a savoir DPA01
 
fault,    fault,       fault,      fault,    fault,   1,                                                                                        
fault,    fault,       fault,      fault,    fault,   1,  => remarque: pas de difference
 
ligne 2
 
fault,    fault,       fault,      fault,    fault,   1,                                                                                                                                                                                                                                                                             ,      ,            ,             ,            ,    fault,   1, => remarque: different
 
ligne 3
 
fault,    fault,       fault,      fault,    fault,   1,                                                                                                                                                                                                                                                                   fault,    fault,          olt,     fault,    fault,   1,=> remarque: different
 
ligne 4
 
fault,    fault,        fault,     fault,    fault,   1,                                                                                                                                                                                                                                                               fault,        at,        fault,         2,    fault,   1, => remarque: different
 
   
 
Comparaison de colonnes=v
 
le code va dans le fichier DATA1.csv et cherche le nom du premier parametre a savoir ame_a celui si a la valeur "fault" la il rentre dans le fichier DATA0.csv et regarde en dessous de ame_a si il ya une value differente
 
DPA01,  fault,  
 
DPA02,       ,      
 
DPA03,  fault,  
 
DPA01,  fault,      
 
dans la cas d'espece nous voyons que le systeme avec le nom DPA2 n'a pas de value cela signe qu'il ya une difference.  
 
ensuite il concidere le second parametre  a savoir ame_m  celui ci possede la valeur "fault" dans le fichier DATA1.csv le code retre de nouveau dans le fichier DATA0.csv et regarde si toute les values sont equivalent a "fault" dans le cas d'espece
 
DPA01,  fault,  
 
DPA02,       ,  
 
DPA03,  fault,    
 
DPA01,     at,        
 
   nous remarquons que cela n'est pas equivalent et ainsi de suite. pour finir qu'il me donne un resultat du genre.
 
-----------------------------------------------------------------------OUTPUT----------------------------------------------------------------------------
 
             false,    false,     false,      false,   true,     true,
 
default, ame_a, ame_m, ame_uc, ame_f, ams_l,  enced_affi,
 
true DPA01,  fault,    fault,       fault,      fault,    fault,     1,
 
false DPA02,       ,           ,             ,            ,      fault,      1,
 
false DPA03,  fault,    fault,          olt,     fault,    fault,     1,
 
false DPA01, fault,        at,        fault,         2,    fault,      1,
 
Nombre de systeme different = 3
 
Nombre de parametres different =4 le nom:
 
ame_a                                                                                                                                                                                                                                                                                                   ame_m                                                                                                                                                                                         ame_uc                                                                                                                                                                                                                                                                                                                             ame_f
 
comme vous pourrez le remarquer code si dessous fait deja une part de l'exercice et la je suis bloque depuis un certain jours c'est un exercice de stage. je vous prie de votre aide. Merci
 
pour toute question je suis pres a vous repondre.
 

Code :
  1. use strict;           
  2. use warnings;         
  3. use File::Compare;     
  4. my %exclude;                           
  5.                                          .
  6. my $file1 = $ARGV[0] || die "Unable to open file";
  7. my $file2 = $ARGV[1] || die "Unable to open file";
  8. my $txtdatei = $ARGV[2] || 'compare.csv';
  9. my $compare = compare($file2, $file1);
  10.  
  11. open my $file, '<', $file1 or die $!;
  12. while (<$file> ) {last if (/^\d+\s+\d{2}:\d{2}:\d{2}\s*$/)}                                     
  13. while (<$file> ) {
  14.   chomp;           
  15.   $exclude{$_}++;   
  16. }
  17. open my $txtfh, '>', $txtdatei or die "Unable to open file"; 
  18. open $file, '<', $file2 or die "Unable to open file";
  19. while (<$file> ) {last if (/^\d+\s+\d{2}:\d{2}:\d{2}\s*$/)}                                                           
  20. while (<$file> ) {
  21.   chomp;           
  22.   if($compare == 1){ 
  23.      
  24.   print $txtfh "FALSE! $_\n" unless $exclude{$_};         
  25.                                                          
  26.                  
  27.   }
  28.   elsif($compare == 0){
  29.            
  30.   print $txtfh "True! the Files are equal \n";   
  31.   }
  32. }
  33. close $txtfh;

mood
Publicité
Posté le 28-07-2015 à 16:12:15  profilanswer
 

n°2263554
gilou
Modérateur
Modzilla
Posté le 29-07-2015 à 17:40:49  profilanswer
 

Tu peux adapter ceci à tes besoins:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6.  
  7. my ($fichier1, $fichier2) = ('Data0.csv', 'Data1.csv');
  8.  
  9. open my $handle, '<', $fichier2;
  10. # initialisation de la ligne modèle à partir de Data1.csv
  11. my  @ligne_modele;
  12. while (<$handle> ) {
  13.    next if ($. <= 2);  # On saute les deux premières lignes
  14.    next if (/^\s*$/);  # et les lignes vides
  15.    s/\s*,\s*/,/og;
  16.    s/\s+$//o;
  17.    @ligne_modele = split /,/, $_;
  18.    shift @ligne_modele;
  19. }
  20. close $handle;
  21.  
  22. # on initialise les flags de colonne identique à 1
  23. my @colonne_identique;
  24. foreach (0..$#ligne_modele) {
  25.    push @colonne_identique, 1;
  26. }
  27.  
  28. open $handle, '<', $fichier1;
  29. my @ligne_identique;
  30. my @premiere_ligne;
  31. while (<$handle> ) {
  32.    next if ($. <= 2);  # On saute les deux premières lignes
  33.    next if (/^\s*$/);  # et les lignes vides
  34.    s/\s*,\s*/,/og;
  35.    s/\s+$//o;
  36.    unless (@premiere_ligne) {
  37.     @premiere_ligne = split /,/, $_;
  38.     shift @premiere_ligne;
  39.     if (@premiere_ligne != @ligne_modele) {
  40.         close $handle;
  41.         die "les deux fichiers csv ont un nombre de champs différents!\n";
  42.     }
  43.    }
  44.    my @temp = split /,/, $_;
  45.    shift @temp;
  46.    
  47.    my $pushed = 0;
  48.    foreach (0..$#temp) {
  49.     if ($ligne_modele[$_] ne $temp[$_]) {
  50.         push @ligne_identique, 0;
  51.         $pushed = 1;
  52.         last;
  53.     }
  54.    }
  55.    # même nombre de champs et chaque champ identique à celui de ligne_modele
  56.    unless ($pushed) {
  57.     push @ligne_identique, 1;
  58.    }
  59.  
  60.    foreach (0..$#temp) {
  61.     if ($colonne_identique[$_] and ($premiere_ligne[$_] ne $temp[$_])) {
  62.         $colonne_identique[$_] = 0;
  63.     }
  64.    }
  65. }
  66.  
  67. my ($nbligdiff, $nbcoldiff);
  68. map { $nbligdiff += $_ } @ligne_identique;
  69. $nbligdiff = @ligne_identique - $nbligdiff;
  70. map { $nbcoldiff += $_ } @colonne_identique;
  71. $nbcoldiff = @colonne_identique - $nbcoldiff;
  72.  
  73. @ligne_identique = map {$_?"true":"false"} @ligne_identique;
  74. @colonne_identique = map {$_?"true":"false"} @colonne_identique;
  75.  
  76. #impression en sortie
  77. print "\t", join(", ", @colonne_identique), "\n";
  78. # rewind du fichier
  79. seek ($handle,0,0);
  80. $. = 0;  # c'est pas automatique après un rewind!
  81. while (<$handle> ) {
  82.    next if ($. <= 1);  # On saute la première ligne
  83.    next if (/^\s*$/);  # et les lignes vides
  84.    if ($. == 2) {
  85.     print $_;
  86.    }
  87.    else {
  88.     print shift(@ligne_identique), " ", $_;
  89.    }
  90. }
  91. close $handle;
  92. print "Lignes distinctes: $nbligdiff\n";
  93. print "Colonnes distinctes: $nbcoldiff\n";


Sur tes données, ça donne en sortie:

       false, false, false, false, true, true
default, ame_a, ame_m, ame_uc, ame_f, ams_l, enced_affi,
true DPA01,  fault,    fault,       fault,      fault,    fault,   1,
false DPA02,       ,           ,             ,            ,    fault,   1,
false DPA03,  fault,    fault,          olt,     fault,    fault,   1,
false DPA01, fault,        at,        fault,          2,    fault,   1,
Lignes distinctes: 3
Colonnes distinctes: 4

 

A+,


Message édité par gilou le 29-07-2015 à 17:43:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2263576
Henri772
Posté le 30-07-2015 à 06:59:18  profilanswer
 

Salut Gilou,
Merci bien de ta proposition, je suis tres satisfait il fait exactement ce que j'ai besion. si c'est pas trop te demander j'ai des questions sur certain lignes 34-39
    s/\s*,\s*/,/og;
   s/\s+$//o;
   unless (@premiere_ligne) {
    @premiere_ligne = split /,/, $_;
    shift @premiere_ligne;
    if (@premiere_ligne != @ligne_modele) {
 
en suite du 47 - 52  
my $pushed = 0;
   foreach (0..$#temp) {
    if ($ligne_modele[$_] ne $temp[$_]) {
        push @ligne_identique, 0;
        $pushed = 1;
        last;
 
 merci bien d'avance.

n°2263590
gilou
Modérateur
Modzilla
Posté le 30-07-2015 à 10:27:51  profilanswer
 

s/\s*,\s*/,/og;
s/\s+$//o;  
 
On nettoie les blancs autour des champs avant de splitter
La première ligne, pour les blancs autour des virgules et la seconde pour les blancs en fin de ligne.
 
unless (@premiere_ligne) { ... }
Si l'array @premiere_ligne n'est pas défini (donc s'il a été juste déclaré) on fait...
@premiere_ligne = split /,/, $_;  
On splitte sur les champs la ligne lue)
shift @premiere_ligne;
On vire le premier champ qui n'est pas utile dans les comparaisons avec les autres lignes
 
if (@premiere_ligne != @ligne_modele) {  
Comme c'est un opérateur numérique, != c'est la valeur numérique des arrays qui va être utilise, ie leur nombre d'éléments.
Donc si @premiere_ligne et @ligne_modele n'ont pas le même nombre d'éléments.
Donc si la première ligne lue (une fois sautée(s) celle(s) à sauter) n'a pas le même nombre de champs que la ligne modèle.
 
my $pushed = 0;  
flag pour savoir si on a déjà rempli @ligne_identique pour la ligne en cours
foreach (0..$#temp) {
    if ($ligne_modele[$_] ne $temp[$_]) { ... }
pour chaque champ de la ligne en cours (sauf le premier, déjà viré de la ligne modèle et de de la ligne en cours avec un shift) on compare le contenu des champs, comparaison comme du texte.
Si un champ de la ligne en cours est différent (opérateur ne) de celui de la ligne modèle...
push @ligne_identique, 0;  
On remplit @ligne_identique pour la ligne en cours avec la valeur fausse
$pushed = 1;  
On mémorise que c'est fait pour la ligne en cours.
last;  
Et on arrête de comparer les champs pour la ligne en cours.
unless ($pushed) { ... }
Si on a trouvé tous les champs identiques
push @ligne_identique, 1;  
On remplit @ligne_identique pour la ligne en cours avec la valeur vrai.
 
A+,


Message édité par gilou le 30-07-2015 à 17:12:33

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2263615
Henri772
Posté le 30-07-2015 à 15:09:27  profilanswer
 

Grand Merci Gilou
bonne journee
a+

n°2264063
Henri772
Posté le 07-08-2015 à 00:03:47  profilanswer
 

Salut Gilou,
je une question concernant un code donc j'essaye de vouloir utiliser les expression regulieres pour qu'il ne decoupe plus les noms a la sortie. les nom sont mit dans l'array suivante :
my @header = (<DATA> =~ /([0-9a-zA-Z_]+)/g); et j#ai utilise cette expression regüliere pour qu'il me revoir les noms complet et non qu'il les decoupe, car j'ai dabort utilise my @header = (<DATA> =~ /([a-z_]+)/g); et il a me deccoupais les noms a la sortie, ensuite j'ai utiliser ce qui est plus haut cela n'a rien changer comment m'y prendre s#il te plait.

n°2264082
gilou
Modérateur
Modzilla
Posté le 07-08-2015 à 11:29:39  profilanswer
 

Et en français, ça donne quoi?
- Je sais pas ce qu'est ton DATA (et les variables glob en perl moderne, j'évite).
- "Les noms complets", j'ai pas de boule de cristal pour savoir de quoi tu parles.
 
A+,


Message édité par gilou le 07-08-2015 à 11:30:00

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2264088
Henri772
Posté le 07-08-2015 à 14:10:02  profilanswer
 

Gilou, s'il te plait ne te moque pas de mon Francais ecrit, je le reconnais, il est de tres mauvais niveau. la question concerne les regex. car j'ai une liste de noms compose de tout genre de caractere que tu puisse imagine j'ai dabort utilise ceci /([a-z_]+)/g il ne marche pas ensuite ceci /(\w+)/g meme lui il ne marche non plus car lorsqu'il recontre les caracteres comme % il ne les affiche pas donc c'est cela mon probleme. j'espere que tu pourras un peu comprendre ce que je veus par la dire. Merci bien A+

n°2264095
Henri772
Posté le 07-08-2015 à 14:57:39  profilanswer
 

c'est resolut
j'ai enfin trouve  
my @header = (<DATA>  =~ /([^,.]+)/g);

n°2264100
gilou
Modérateur
Modzilla
Posté le 07-08-2015 à 16:53:53  profilanswer
 

Henri772 a écrit :

Gilou, s'il te plait ne te moque pas de mon Francais ecrit, je le reconnais, il est de tres mauvais niveau.

Je me moquais pas de l'orthographe, je voulais juste te faire comprendre que ton post était totalement incompréhensible pour tout le monde sauf toi, car tu ne donnais pas assez d'informations (et tu n'en donnes toujours pas assez dans la suite) pour qu'on puisse te répondre. Je ne sais pas faire une demi-réponse quand j'ai une demi-question.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 07-08-2015 à 16:53:53  profilanswer
 

n°2264114
Henri772
Posté le 07-08-2015 à 22:47:59  profilanswer
 

au fait c'est rien de grave Gilou, moi meme je le reconnais la langue francaise a ete toujours pour moi un casse-tete. pas de sousi Gilou, je ne l'ai meme pas du tout mal pris.
bonne soiree
A+

n°2264440
Henri772
Posté le 14-08-2015 à 23:36:14  profilanswer
 

Salut Gilou,  
je vais me permettre de te derrange une fois de plus j'ai 2 code donc j'aimerai que le Resultat de chacun des Code soit ecrit sur le meme fichier,
jusqu'ici je ne reussi pas. le second resultat ecrase toujours le premier resultat
si tu regarde plus haut le premier code traite le data que j'ai nomme DATA0.csv et le second traite le output ceci sans "le nombre de parametres et nombre de systemes"  
 

Code :
  1. #!/usr/bin/perl
  2.     use strict;
  3.     use warnings;
  4.     use autodie;
  5.     use List::Util 'any';
  6.    
  7.     my $input_file = 'DATA.csv';
  8.     my (@headers, %docs);
  9. my $n = 0;
  10. my @docs;
  11.     #open my $fh, '>',"fh.html";
  12. open(my $Fhresult, '<', $input_file);
  13.     while (<$Fhresult> ) {     
  14.      last if (/^\d+\s+\d{2}:\d{2}:\d{2}\s*$/);
  15.     }
  16.     while (<$Fhresult> ) {
  17.      if ($. == 2) {       
  18.        chomp; 
  19.        s/^default,\s*//;   
  20.        @headers = split ( /[ ,. ;:\(\)\/\*\"]+/ ); 
  21.        next; # immer weiter
  22.      }
  23.      next unless /\S/;
  24.      chomp;
  25.     my ($file, @fields) = split /\s*,\s*|\s+/; 
  26.     push @docs, {'file'=>$file, 'fields'=>\@fields} if any { $_ eq 'fault' } @fields;
  27. }
  28. foreach my $doc (@docs) {       
  29. open(my $fh, '>', "$doc->{'file'}.html" );
  30.     print $fh  "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">
  31. <html>
  32. <head>
  33.    <title>SYSTEM</title>
  34.    <meta charset=\"UTF-8\"/>
  35.    <link href=\"syst.css\" type=\"text/css\" rel=\"stylesheet\"/>
  36. </head>
  37. <body>\n<div id=\"c1\">\n<table align=\"left\">\n<tr>\n<th>";
  38.     print $fh $doc->{'file'} , ":</th>\n</tr>\n";
  39.     foreach (0..$#headers) {     #läuft die ganze Liste ab indice 0 durch
  40.         print $fh ("<tr><td>$headers[$_]</td>\n<td>$doc->{'fields'}[$_]</td></tr>" );
  41.   ++$n;
  42.     }
  43. print $fh "</tr></table>\n\n</div></body>\n</html>";
  44. }
  45. use Text::CSV;
  46. my $csv = Text::CSV->new;
  47. open my $csv_file, "<", "DATA2.csv" or die "Can't open CSV file: $!\n";
  48. while (my $row = $csv->getline($csv_file)) {
  49.    
  50.     my($significator_and_file) = clean($row->[0]);
  51.     my ($significator, $file) = split /\s+/, $significator_and_file;
  52.     next unless $significator and $significator eq 'false';
  53.     open my $fh, ">", "$file.html" or die "Can't open per-line file $file: $!\n";
  54.  
  55.     shift @$row;
  56. print $fh "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">
  57. <html>
  58. <head>
  59.    <title>SYSTEM</title>
  60.    <meta charset=\"UTF-8\"/>
  61.    <link href=\"syst.css\" type=\"text/css\" rel=\"stylesheet\"/>
  62. </head>
  63.     <body>\n<div id=\"c1\">\n<table>\n<tr><th>";
  64. #print $fh  "<table>\n<tr><th>"
  65. print $fh "$file:</th></tr>\n";
  66. for my $i(map {clean($_)} @$row) {
  67. my $d = "<tr><td>$i</td></tr>\n";
  68.     print $fh $d if ($i);
  69. }
  70.     print $fh "</table>";
  71.     #close $fh;
  72. }
  73. sub clean {
  74.     my $string = shift;
  75.     $string =~ s/^\s+//;
  76.     $string =~ s/\s+$//;
  77.     return $string;
  78. }


n°2264441
gilou
Modérateur
Modzilla
Posté le 15-08-2015 à 00:40:01  profilanswer
 

Bon, j'ai pas testé, mais à vue de nez, ça devrait être comme suit:
1) faire le close

Code :
  1. print $fh "</table>";
  2.    close $fh;
  3. }
  4. sub clean {


 
2) ouvrir tes fichiers en mode append (donc deux >> ) pour écrire en fin de fichier a chaque réouverture:

Code :
  1. open my $fh, ">>", "$file.html" or die "Can't open per-line file $file: $!\n";


 
Le seul truc, c'est que les fichiers de sortie $file.html (donc DPA01.html, DPA02.html... avec ton exemple) ne doivent pas exister au lancement du script (bref, les fichiers résultat d'une exécution antérieure du script doivent avoir été effacés avant le lancement du script).
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2264452
Henri772
Posté le 15-08-2015 à 11:43:31  profilanswer
 

Bonjour ,
Ca travail deja dans ce sens mais pas tres, sie tu observes le nom des Systemes sont sur la premiere colonne de DATA0.csv et je dirai dans le fichier OUTPUT dans la 2eme Colonne apres naturellement la colonne avec false et true. donc ce que me revois le premier Code c'est ce qu'il est correct et ce que me revoit le Code 2 c'est ce qui n'est pas correct c'est a dire les systeme donc "false" se trouve a l'avant, ce qui est impotant ici c'est que les noms des systemes sont les meme mais on der Valeurs differentes. ces 2 Codes travaille parfaitement quand il sont separe mais j'aimerai les avoir sur um meme fichier pour pouvoir facilement cerne ou se trouve la difference. c'est la raison pour laquelle je suis coince. et il devait toujours me revoye le resultat en plusieurs Fichiers a savoir un fichier par systeme.


Message édité par Henri772 le 15-08-2015 à 11:44:03
n°2264458
gilou
Modérateur
Modzilla
Posté le 15-08-2015 à 13:55:12  profilanswer
 

Ton post précédent est incompréhensible sans accès direct à ton cerveau pour savoir de quoi tu parles.
Donne un exemple avec les fichiers en entrée, et le(s) fichier(s) en sortie, qu'on comprenne ce que tu veux obtenir au final.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2264463
Henri772
Posté le 15-08-2015 à 15:50:58  profilanswer
 

gilou a écrit :

Ton post précédent est incompréhensible sans accès direct à ton cerveau pour savoir de quoi tu parles.
Donne un exemple avec les fichiers en entrée, et le(s) fichier(s) en sortie, qu'on comprenne ce que tu veux obtenir au final.
 
A+,


 
----------------------------DATA.csv--------------------------------------  
20150714 00:08:49
default, ame_a, ame_m, ame_uc, ame_f, ams_l, enced_affi,
 
DPA01,  fault,    fault,       fault,      fault,    fault,   1,
 
DPA02,       ,           ,             ,            ,       fault,   1,
 
DPA03,  fault,    fault,          olt,     fault,    fault,   1,
 
DPA01, fault,        at,        fault,          2,    fault,   1,  
 
------------------------------DATA2.csv--------------------------------
20150714 00:08:49
             false,    false,     false,      false,   true,     true,
 
default, ame_a, ame_m, ame_uc, ame_f, ams_l,  enced_affi,
 
false DPA01,  fault,    fault,       mul,      fault,    fault,     1,
 
true  DPA02,       ,           ,             ,            ,      fault,      1,
 
false DPA03,  fault,    fault,          olt,     fault,    fault,     1,
 
false DPA01, fault,        at,        fault,         2,    fault,      1,  
 
 
voici une sortie lorsqu'il ya une difference pour le cas precis le systeme DPA01 a "false" au depart donc il ya une diference et la difference c'est "mul" 3 Colonne apres DPA01 ligne 2 apres les noms des parametres en dessus  
-------------------------sortie------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
   <title>SYSTEM</title>
   <meta charset="UTF-8"/>
   <link href="syst.css" type="text/css" rel="stylesheet"/>
 </head>
 <body>
<div id="c1">
<table align="left">
<tr>
<th>DPA01:</th>
</tr>
<tr><td>fault</td></tr><tr><td>ame_a</td>
<tr><td>fault</td></tr><tr><td>ame_m</td>
<tr><td>fault</td></tr><tr><td>ame_uc</td>
<tr><td>faulta </td></tr><tr><td>me_f</td>
<tr><td>fault</td></tr><tr><td>ams_l</td>
<tr><td>fault</td></tr><tr><td>enced_affi</td>
</table>
<table>
<tr><th>DPA01:</th></tr>
<tr><td>fault</td></tr>
<tr><td>fault </td></tr>    
<tr><td>mul </td></tr>    
<tr><td>fault </td></tr>
<tr><td>fault</td></tr>
<tr><td>1</td></tr>
</table>
 
Dans le cas ou il n'y aurai pas eu de difference prenons encore le cas DPA01 la sortie aurai ete  juste la le 2eme code n'aurait pas determine de difference et n'aurait rien renvoye et on obtiendrai juste
-------------------------------------------sortie-----------------------------------------------------------------------
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
   <title>SYSTEM</title>
   <meta charset="UTF-8"/>
   <link href="syst.css" type="text/css" rel="stylesheet"/>
 </head>
 <body>
<div id="c1">
<table align="left">
<tr>
<th>DPA01:</th>
</tr>
<tr><td>fault</td></tr><tr><td>ame_a</td>
<tr><td>fault</td></tr><tr><td>ame_m</td>
<tr><td>fault</td></tr><tr><td>ame_uc</td>
<tr><td>faulta </td></tr><tr><td>me_f</td>
<tr><td>fault</td></tr><tr><td>ams_l</td>
<tr><td>fault</td></tr><tr><td>enced_affi</td>
</table>
 
tu vas le remarque je n'ais pas donne toute les sorties qui son sense etre renvoye j'ai juste concidere un cas pour essaye d'explique le probleme, si a jamais c'est pas claire renvoi moi une question merci d'avance
a+


Message édité par Henri772 le 15-08-2015 à 15:57:49
n°2264465
gilou
Modérateur
Modzilla
Posté le 15-08-2015 à 20:32:22  profilanswer
 

Et avec ton exemple, tu afficherais quoi dans ton fichier de sortie pour la ligne  
true  DPA02,       ,           ,             ,            ,      fault,      1,  
??
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2264466
Henri772
Posté le 15-08-2015 à 21:03:32  profilanswer
 

True ne sera pas pris en considerations seulement les ligne avec false  
et comme tu le vois c'est un tableau avec html dans le cas ou il n'y aura pas de valeurs defini le champs restera vide dans le Tableau, comme je l'ai dit les 2 code fonctionne sans Probleme quand ils sont lance separement j'aimerais que les resultat soit affiche ecrit sur la meme fichier pour chacun des systemes

n°2264467
gilou
Modérateur
Modzilla
Posté le 15-08-2015 à 22:54:39  profilanswer
 

Bon, si c'est juste pour écrire dans les même fichiers,
1) tu fais toutes ouvertures en mode append:
open(my $fh, '>>', "$doc->{'file'}.html" );
et
open my $fh, '>>', "$file.html" or die "Can't open per-line file $file: $!\n";
2) Tu fermes ce que tu as ouvert avant d'ouvrir autre chose avec le même handle:
print $fh "</tr></table>\n\n</div></body>\n</html>";
close $fh;
}
et
    print $fh "</table>";
    close $fh;
}
3) tu effaces les fichiers résultat de script (DPA01.html, DPA02.html, DPA03.html) avant de lancer ton script
 
Et tu verras que ça s'écrit dans les fichiers sans écraser.
Tu verras même qu'il y en a de trop (ton premier script écrasait au moins une fois un fichier sur lequel il avait déjà écrit, et il y a des headers en double aussi), et que tu vas devoir en tenir compte.
 
A+,
 
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2264471
Henri772
Posté le 16-08-2015 à 10:41:09  profilanswer
 

ca marche mais je pense que le probleme ce situe au niveau de mes code. je vais essaye de m'explique j'espere que tu vas pouvoir me comprend . au fais le noms de systemes par exemple DPA01 ou DPA02 et ainsi de suite peuvent apparaitre plusieurs fois dans un fichier ca veut dire que lorsqu'on veut les ecrires dans un fichier ils seront ecrit par concequent plusieurs fois dans le fichiers de sortie et ainsi on remarquera que au lieu d'avoir ecrit le systeme avec ces valeurs quand elle est correct et le systeme avec ce values quand elle ne sont pas correct , le code ecrit tout autant de fois qu'il rencontrera parexemple DPA01 et le fais aussi autant de fois qu'il rencontrera par exemple DPA02.
au final on recoit par exmple un fichier du nom DPA01 avec la correcte version et le nombre de fois que DPA01 apparait dans le fichier DATA.csv et DATA2.csv et la tout de vient confu. je dois essye de voire,s'il es possible de ressoudre cela. (les header c'est pas un probleme je peu me les enlever plus tard)
pour un appercu on recoit parexemple un fichier de la sorte  
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
   <title>SYSTEM</title>
   <meta charset="UTF-8"/>
   <link href="syst.css" type="text/css" rel="stylesheet"/>
 </head>
 <body>
<div id="c1">
<table align="left">
<tr>
<th>DPA01:</th>
</tr>
<tr><td>fault</td></tr><tr><td>ame_a</td>
<tr><td>fault</td></tr><tr><td>ame_m</td>
<tr><td>fault</td></tr><tr><td>ame_uc</td>
<tr><td>faulta </td></tr><tr><td>me_f</td>
<tr><td>fault</td></tr><tr><td>ams_l</td>
<tr><td>fault</td></tr><tr><td>enced_affi</td>
</table>
<table>
<tr><th>DPA01:</th></tr>
<tr><td>fault</td></tr>
<tr><td>fault </td></tr>    
<tr><td>mul </td></tr>    
<tr><td>fault </td></tr>
<tr><td>fault</td></tr>
<tr><td>1</td></tr>
</table>  
<table>
<tr><th>DPA01:</th></tr>
<tr><td>fault</td></tr>
<tr><td>fault </td></tr>    
<tr><td>mul </td></tr>    
<tr><td>fault </td></tr>
<tr><td>fault</td></tr>
<tr><td>1</td></tr>
</table>  
<table>
<tr><th>DPA01:</th></tr>
<tr><td>fault</td></tr>
<tr><td>fault </td></tr>    
<tr><td>mul </td></tr>    
<tr><td>fault </td></tr>
<tr><td>fault</td></tr>
<tr><td>1</td></tr>
</table>  
<table>
<tr><th>DPA01:</th></tr>
<tr><td>fault</td></tr>
<tr><td>fault </td></tr>    
<tr><td>mul </td></tr>    
<tr><td>fault </td></tr>
<tr><td>fault</td></tr>
<tr><td>1</td></tr>
</table>  
<table align="left">
<tr>
<th>DPA01:</th>
</tr>
<tr><td>fault</td></tr><tr><td>ame_a</td>
<tr><td>fault</td></tr><tr><td>ame_m</td>
<tr><td>fault</td></tr><tr><td>ame_uc</td>
<tr><td>faulta </td></tr><tr><td>me_f</td>
<tr><td>fault</td></tr><tr><td>ams_l</td>
<tr><td>fault</td></tr><tr><td>enced_affi</td>
</table>
<table align="left">
<tr>
<th>DPA01:</th>
</tr>
<tr><td>fault</td></tr><tr><td>ame_a</td>
<tr><td>fault</td></tr><tr><td>ame_m</td>
<tr><td>fault</td></tr><tr><td>ame_uc</td>
<tr><td>faulta </td></tr><tr><td>me_f</td>
<tr><td>fault</td></tr><tr><td>ams_l</td>
<tr><td>fault</td></tr><tr><td>enced_affi</td>
</table>
<table align="left">
<tr>
<th>DPA01:</th>
</tr>
<tr><td>fault</td></tr><tr><td>ame_a</td>
<tr><td>fault</td></tr><tr><td>ame_m</td>
<tr><td>fault</td></tr><tr><td>ame_uc</td>
<tr><td>faulta </td></tr><tr><td>me_f</td>
<tr><td>fault</td></tr><tr><td>ams_l</td>
<tr><td>fault</td></tr><tr><td>enced_affi</td>
</table>
<table align="left">
<tr>
<th>DPA01:</th>
</tr>
<tr><td>fault</td></tr><tr><td>ame_a</td>
<tr><td>fault</td></tr><tr><td>ame_m</td>
<tr><td>fault</td></tr><tr><td>ame_uc</td>
<tr><td>faulta </td></tr><tr><td>me_f</td>
<tr><td>fault</td></tr><tr><td>ams_l</td>
<tr><td>fault</td></tr><tr><td>enced_affi</td>
</table>


Message édité par Henri772 le 16-08-2015 à 10:45:01
n°2264484
Henri772
Posté le 17-08-2015 à 01:23:24  profilanswer
 

pas


Message édité par Henri772 le 19-08-2015 à 09:28:30
n°2264606
gilou
Modérateur
Modzilla
Posté le 19-08-2015 à 20:52:35  profilanswer
 

Bon, ben pour te donner un peu d'inspiration, j'ai pondu ça cet aprem:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. # lecture du fichier des valeurs par défaut
  7. sub read_defaults ($) {
  8.  my %default;
  9.  my $file = shift;
  10.  
  11.  open my $handle, '<', $file;
  12.  while (<$handle> ) {
  13.    chop;
  14.    next if (/^\s*\d{8}\s\d{2}:\d{2}:\d{2}\s*$/); # on saute les lignes de dates
  15.    next if (/^\s*$/);                            # on saute les lignes vides
  16.    # nettoyage de la ligne
  17.    s/\s*,\s*/,/og;  # blanc autour des virgules
  18.    s/^\s+//o;       # blanc initial
  19.    s/\s+$//o;       # blanc final
  20.    s/,$//o;         # virgule en fin de ligne
  21.    s/^[^,]*,//o;    # premier champ
  22.    # si on n'a encore rien lu, c'est la ligne des noms des champs
  23.    unless ($default{'names'}) {
  24.      $default{'names'} = $_;
  25.      next;
  26.    }
  27.    # sinon, c'est la ligne des valeurs par défaut
  28.    unless ($default{'values'}) {
  29.      $default{'values'} = $_;
  30.      last;
  31.    }
  32.  }
  33.  close $handle;
  34.  return \%default;
  35. }
  36.  
  37. # pattern pour matcher les lignes semblables a la ligne par défaut
  38. # semblable: pour chaque champ, soit ilm est identique a la valeur par dfaut,
  39. # soit il est réduit à ''
  40. sub make_default_pattern ($) {
  41.  my @tmp = split /,/, shift;
  42.  map {s/^(.+)$/($1)?/o;} @tmp;
  43. return join(",", @tmp);
  44. }
  45.  
  46. # lecture du fichier des données
  47. sub read_data ($$) {
  48.  my %data;
  49.  my ($file, $default) = (shift, shift);
  50.  
  51.  open my $handle, '<', $file;
  52.  my $pattern = make_default_pattern($default->{'values'});
  53.  my $nbsep;
  54.  $nbsep++ while ($default->{'values'} =~ m/,/g);
  55.  while (<$handle> ) {
  56.    chop;
  57.    next if (/^\s*\d{8}\s\d{2}:\d{2}:\d{2}\s*$/);
  58.    next if (/^\s*$/);
  59.    # nettoyage de la ligne
  60.    s/\s*,\s*/,/og;  # blanc autour des virgules
  61.    s/^\s+//o;       # blanc initial
  62.    s/\s+$//o;       # blanc final
  63.    s/,$//o;         # virgule en fin de ligne
  64.    if (/^([^,]+),(.*)$/) {
  65.      my ($head, $champs) = ($1, $2);
  66.      if ($head eq "default" ) {
  67.     if ($champs ne $default->{'names'}) {
  68.       print "Les noms des champs sont differents entre le fichier des defauts et celui des donnees!\n";
  69.       print "Defaut : $default->{'names'}\n";
  70.       print "Donnees: $champs\n";
  71.       last;
  72.     }
  73.     next;
  74.      }
  75.      next if ($champs =~ /^$pattern$/);
  76.      if ($champs !~ /[^,]*(,[^,]*){$nbsep}/) {
  77.     print "Ligne $. pas le bon nombre de champs: $_\n";
  78.     next;
  79.      }
  80.      unless ($data{$head} and $data{$head}{$champs}) {
  81.     $data{$head}{$champs} = $.;
  82.      }
  83.    }
  84.    else {
  85.      print "Ligne $. inattendue: $_\n";
  86.    }
  87.  }
  88.  close $handle;
  89.  return \%data;
  90. }
  91.  
  92. # fonctions utilitaires pour imprimer en html
  93. sub print_html_top ($) {
  94.  my $fh = shift;
  95.  print $fh '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"', "\n";
  96.  print $fh '                      "http://www.w3.org/TR/html4/strict.dtd">', "\n";
  97.  print $fh '<html>', "\n";
  98.  print $fh '  <head>', "\n";
  99.  print $fh '    <title>SYSTEM</title>', "\n";
  100.  print $fh '    <meta charset="UTF-8"/>', "\n";
  101.  print $fh '    <link href="syst.css" type="text/css" rel="stylesheet"/>', "\n";
  102.  print $fh '    <style type="text/css">', "\n";
  103.  print $fh '      th, td { padding: 5px; }', "\n";
  104.  print $fh '    </style>', "\n";
  105.  print $fh '  </head>', "\n";
  106.  print $fh '  <body>', "\n";
  107. }
  108.  
  109. sub print_html_bottom ($)  {
  110.  my $fh = shift;
  111.  print $fh '  </body>', "\n";
  112.  print $fh '</html>', "\n";
  113. }
  114.  
  115. sub print_html_title ($$)  {
  116.  my ($fh, $title)  = (shift, shift);
  117.  print $fh '    <h1>', $title, '</h1>', "\n";
  118. }
  119.  
  120. sub print_html_table_start ($)  {
  121.  my $fh = shift;
  122.  print $fh '    <table border="1">', "\n";
  123. }
  124.  
  125. sub print_html_table_end ($)  {
  126.  my $fh = shift;
  127.  print $fh '    </table>', "\n";
  128. }
  129.  
  130. sub print_table_line ($$)  {
  131.  my ($fh, $line) = (shift, shift);
  132.  $line =~ s/,,/,&nbsp;,/og;
  133.  $line =~ s/,/<\/td><td>/og;
  134.  print $fh '      <tr><td>', $line, '</td></tr>', "\n";
  135. }
  136.  
  137. sub print_html_many ($$) {
  138.  my ($data, $default) = (shift, shift);
  139.  
  140.  foreach my $head (sort (keys %$data)) {
  141.    open my $fh, '>', "$head.html";
  142.    
  143.    print_html_top($fh);
  144.    print_html_title($fh, $head);
  145.    print_html_table_start($fh);
  146.    # la ligne des noms des colonnes
  147.    print_table_line($fh, $default->{'names'});
  148.    # la ligne des valeurs par défaut
  149.    print_table_line($fh, $default->{'values'});
  150.    # les lignes avec une valeur autre que celles par défaut
  151.    foreach (sort {$data->{$head}{$a} <=> $data->{$head}{$b}} (keys %{$data->{$head}})) {
  152.      print_table_line($fh, $_);
  153.    }
  154.    print_html_table_end($fh);
  155.    print_html_bottom($fh);
  156.    
  157.    close $fh;
  158.  }
  159. }
  160.  
  161. sub print_html_unique ($$$) {
  162.  my ($file, $data, $default) = (shift, shift, shift);
  163.  
  164.  open my $fh, '>', $file;
  165.  print_html_top($fh);
  166.  foreach my $head (sort (keys %$data)) {
  167.    print_html_title($fh, $head);
  168.    print_html_table_start($fh);
  169.    # la ligne des noms des colonnes
  170.    print_table_line($fh, $default->{'names'});
  171.    # la ligne des valeurs par défaut
  172.    print_table_line($fh, $default->{'values'});
  173.    # les lignes avec une valeur autre que celles par défaut
  174.    foreach (sort {$data->{$head}{$a} <=> $data->{$head}{$b}} (keys %{$data->{$head}})) {
  175.      print_table_line($fh, $_);
  176.    }
  177.    print_html_table_end($fh);
  178.  }
  179.  print_html_bottom($fh);
  180.  close $fh;
  181. }
  182.  
  183.  
  184. sub process {
  185.  my ($args) = @_;
  186.  my $default = read_defaults($args->{defaultfile});
  187.  my $data = read_data($args->{datafile}, $default);
  188.  print_html_many($data, $default) if ($data);
  189.  print_html_unique($args->{outputfile}, $data, $default) if ($data);
  190. }
  191.  
  192. # paramètre nommés afin d'éviter les erreurs d'user input
  193. process({defaultfile => 'defaultwerte.csv',
  194.      datafile => 'Data0.csv',
  195.      outputfile => 'output.html'});


 
Avec ces fichiers test:
defaultwerte.csv

20150804 01:21:52
default, ame_c, ame_m, ame_uc, ame_mem, ams_lo, en_affi
default,  fault,    fault,     fault,      fault,          fault,    1,


Data0.csv

20150714 00:08:49
default, ame_c, ame_m, ame_uc, ame_mem, ams_lo, en_affi,
DPA01,  fault,    fault,       fault,      fault,    fault,   1,
DPA02,       ,           ,             ,            ,    fault,   1,
DPA03,  fault,    fault,          olt,     fault,    fault,   1,
DPA03,  fault,    fault,          fault,     fault,    fault,   1,
DPA01, fault,        at,        fault,          2,    fault,   1,  
DPA01, fault,        et,        fault,          2,    fault,   1,  
DPA02,       ,          it ,             ,            ,    fault,   1,
DPA03,  fault,    fault,          olt,     fault,    fault,   1,
DPA01, fault,        at,        fault,          2,    fault,   1,


 
Tu pourras en tester le résultat et ça devrait te donner des idées sur la manière de procéder.
 
A+,
 


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


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

  compare 2 fichiers (lignes et colonnes)

 

Sujets relatifs
VBA sélectionner contenus de plusieurs fichiers excelmacro pour copier coller lignes
liste de fichiers dans un array trié par date : 3eme fichier non listéVBS copie de fichiers avec recherche de nom
[BATCH] Pb numérotation de fichiersException de sécurité tout en accédant à des données de fichiers XML (
fichiers temporaires TomcatVBA : Compter le nombre de fichiers PDF dans des sous-dossiers
fichiers css et htmlCopie coller avec VBA deux fichiers différents
Plus de sujets relatifs à : compare 2 fichiers (lignes et colonnes)


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