compare 2 fichiers (lignes et colonnes) - Perl - Programmation
Marsh Posté le 29-07-2015 à 17:40:49
Tu peux adapter ceci à tes besoins:
Code :
|
Sur tes données, ça donne en sortie:
false, false, false, false, true, true |
A+,
Marsh Posté le 30-07-2015 à 06:59:18
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.
Marsh Posté le 30-07-2015 à 10:27:51
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+,
Marsh Posté le 07-08-2015 à 00:03:47
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.
Marsh Posté le 07-08-2015 à 11:29:39
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+,
Marsh Posté le 07-08-2015 à 14:10:02
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+
Marsh Posté le 07-08-2015 à 14:57:39
c'est resolut
j'ai enfin trouve
my @header = (<DATA> =~ /([^,.]+)/g);
Marsh Posté le 07-08-2015 à 16:53:53
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+,
Marsh Posté le 07-08-2015 à 22:47:59
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+
Marsh Posté le 14-08-2015 à 23:36:14
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 :
|
Marsh Posté le 15-08-2015 à 00:40:01
Bon, j'ai pas testé, mais à vue de nez, ça devrait être comme suit:
1) faire le close
Code :
|
2) ouvrir tes fichiers en mode append (donc deux >> ) pour écrire en fin de fichier a chaque réouverture:
Code : |
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+,
Marsh Posté le 15-08-2015 à 11:43:31
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.
Marsh Posté le 15-08-2015 à 13:55:12
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+,
Marsh Posté le 15-08-2015 à 15:50:58
gilou a écrit : Ton post précédent est incompréhensible sans accès direct à ton cerveau pour savoir de quoi tu parles. |
----------------------------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+
Marsh Posté le 15-08-2015 à 20:32:22
Et avec ton exemple, tu afficherais quoi dans ton fichier de sortie pour la ligne
true DPA02, , , , , fault, 1,
??
A+,
Marsh Posté le 15-08-2015 à 21:03:32
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
Marsh Posté le 15-08-2015 à 22:54:39
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+,
Marsh Posté le 16-08-2015 à 10:41:09
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>
Marsh Posté le 19-08-2015 à 20:52:35
Bon, ben pour te donner un peu d'inspiration, j'ai pondu ça cet aprem:
Code :
|
Avec ces fichiers test:
defaultwerte.csv
20150804 01:21:52 |
Data0.csv
20150714 00:08:49 |
Tu pourras en tester le résultat et ça devrait te donner des idées sur la manière de procéder.
A+,
Marsh Posté le 28-07-2015 à 16:12:15
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.