compte sur l'horizontale et la verticale - Perl - Programmation
Marsh Posté le 08-06-2015 à 18:40:35
Tu peux t'inspirer d'un truc de ce genre:
Code :
|
A+,
Marsh Posté le 08-06-2015 à 21:00:38
Salut Gilou ,#
merci de ta proposition je pense que ton code a un Probleme comme le mien ou alors c'est moi qui n'a pas bien explique voila un exemple de DATA.
20150606 00:23:41
default, primary, secondary, copy_directory, forced_copy_flag, always_allow_dump, type_of_dump, full_memory_dump,
d100spuptl25e0, /dev/lg_dumplv, /dev/sysdumpnull, /var/adm/ras, 1 1 fault, disallow,
doc10, 5 fault, 7 8 9 10 disallow,
doc11, 5 fault, 7 8 9 10 disallow,
doc12, 5 fault, 7 8 9 10 disallow,
doc13, 5 fault, 7 8 9 10 disallow,
doc14, 5 fault, 7 8 9 10 disallow,
doc15, 5 fault, 7 8 9 10 disallow,
doc16, 5 fault, 7 8 9 10 disallow,
doc17, 5 fault, 7 8 9 10 disallow,
doc18, 5 fault, 7 8 9 10 disallow,
doc19, 5 fault, 7 8 9 10 disallow,
doc1, /del, /dev/null, /ras, 1 0 fw-assisted, disallow,
doc20, 5 fault, 7 8 9 10 disallow,
doc21, /dev/lg_dumplv, /dev/sysdumpnull, //ras, 1 1 fw, disallow,
doc22, /dev/lg_dumplv, /dev/sysdumpnull, //ras, 1 1 fw, disallow,
doc23, /dev/lg_dumplv, /dev/sysdumpnull, //ras, 1 1 fw, disallow,
doc24, /dev/lg_dumplv, /dev/sysdumpnull, //ras, 1 1 fw, disallow,
doc25, /dev/lg_dumplv, /dev/sysdumpnull, //ras, 1 1 fw, disallow,
doc26, /dev/lg_dumplv, /dev/sysdumpnull, //ras, 1 1 fw, disallow,
doc27, /dev/lg_dumplv, /dev/sysdumpnull, //ras, 1 1 fw, disallow,
doc28, /dev/lg_dumplv, /dev/sysdumpnull, //ras, 1 1 fw, disallow,
doc29, /dev/lg_dumplv, /dev/sysdumpnull, //ras, 1 1 fw, disallow,
doc2, /dev/lg_dumplv, /dev/sysdumpnull, //ras, 1 1 fw, disallow,
doc30, /dev/lg_dumplv, /dev/sysdumpnull, //ras, 1 1 fw, disallow,
doc31, /dev/lg_dumplv, /dev/sysdumpnull, /var/adm/ras, 1 fault, fw-assisted, disallow,
doc32, /dev/lg_dumplv, /dev/sysdumpnull, /var/adm/ras, 1 fault, fw-assisted, disallow,
doc33, /dev/lg_dumplv, /dev/sysdumpnull, /var/adm/ras, 1 fault, fw-assisted, disallow,
doc34, /dev/lg_dumplv, /dev/sysdumpnull, /var/adm/ras, 1 fault, fw-assisted, disallow,
doc35, /dev/lg_dumplv, /dev/sysdumpnull, /var/adm/ras, 1 fault, fw-assisted, disallow,
doc36, /dev/lg_dumplv, /dev/sysdumpnull, /var/adm/ras, 1 fault, fw-assisted, disallow,
doc37, /dev/lg_dumplv, /dev/sysdumpnull, /var/adm/ras, 1 fault, fw-assisted, disallow,
doc38, /dev/lg_dumplv, /dev/sysdumpnull, /var/adm/ras, 1 fault, fw-assisted, disallow,
doc39, /dev/lg_dumplv, /dev/sysdumpnull, /var/adm/ras, 1 fault, fw-assisted, disallow,
doc3, /dev/lg_dumplv, /dev/sysdumpnull, /var/adm/ras, 1 fault, fw-assisted, disallow,
doc40, /dev/lg_dumplv, /dev/sysdumpnull, /var/adm/ras, 1 fault, fw-assisted, disallow,
doc41, 5 fault, 7 8 9 10 disallow,
doc42, 5 fault, 7 8 9 10 disallow,
doc43, 5 fault, 7 8 9 10 disallow,
doc44, 5 fault, 7 8 9 10 disallow,
doc45, 5 fault, 7 8 9 10 disallow,
doc46, 5 fault, 7 8 9 10 disallow,
doc47, 5 fault, 7 8 9 10 disallow,
doc48, 5 fault, 7 8 9 10 disallow,
doc49, 5 fault, 7 8 9 10 disallow,
doc4, 5 fault, 7 8 9 10 disallow,
doc50, 5 fault, 7 8 9 10 disallow,
doc51, 5 fault, 7 8 9 10 disallow,
doc52, 5 fault, 7 8 9 10 disallow,
doc53, 5 fault, 7 8 9 10 disallow,
doc54, 5 fault, 7 8 9 10 disallow,
de primary jusqu'a full_memory_dump, sont sur la meme ligne malheureusement il difficile de l'affiche comme sur mon fichier.
default ici remplace 'pere' et en desous de 'pere' sur la meme colonne c'est le nombre de document que j'aimerai determiner.
20150606 00:23:41 est pour informations.
car lorsque j#execute le code il me renvoit hori=0 vert= 0
mon code me revoit =9 et verti = 0 ce qui n'est pas vrais .
et s'il faut se fier a ce fichier donc je t'ai pose le resultat serait
Hori= 7 et verti = 50.
Merci bien de ton aide.
Marsh Posté le 08-06-2015 à 21:01:42
en voici mon code:
#!/usr/bin/perl -w
use strict;
use diagnostics;
use warnings;
use Text::CSV;
open(INPUT, "<DATA.csv" );
my $horiz = 0;
my $vert = 0;
while (<INPUT> ) {
next if /Informations/;
my $f = 1 if /father/;
$vert++ if $f;
my @line_array = split(/, /);
my $array_size = scalar(@line_array);
$array_size-- if $f;
$horiz = $array_size if ($horiz < $array_size);
}
print "Horiz = $horiz \n Vert = $vert\n"
Marsh Posté le 08-06-2015 à 21:32:47
Ben il suffisait juste de remplacer dans mon code avec tes nouvelles données:
A) c'est plus après Informations qu'on commence le traitement mais après un truc de la forme \d+\s+\d{2}:\d{2}:\d{2} bref, des chiffres suivis d'une date
B) pere est remplacé par default
ca donne ceci:
Code :
|
Code qui sur tes données donne en sortie: horizontal: 7 et vertical: 50
(bon, au premier test sur mon code modifié, ça donnait horizontal: 8 car le blanc après la virgule finale créait un champ vide, mais en remplaçant grep {!/^default$/} par grep {!/^(default)?$/} on élimine ce problème).
A+,
Marsh Posté le 08-06-2015 à 21:43:34
Merci bien ca fonctionne parfaitement .
j'ai vraiment un gros probleme avec les expressions regulaire.
tu m'avais envoye des lien j'ai lu et jusque la, les mettre en pratique est toujours difficile.
bonne soiree a+
Marsh Posté le 08-06-2015 à 22:32:11
Gilou,
je vais me permettre encore de te derrange une fois de plus.
je ne comprend pas les ligne 9, 11, et 13.
merci bien
Marsh Posté le 08-06-2015 à 23:05:41
ligne 9: while (<$fh> ) {last if (/^\d+\s+\d{2}:\d{2}:\d{2}\s*$/)}
On lit le fichier ligne a ligne while (<$fh> ) {...} et on s'arrête si on lit une ligne compose d'un nombre suivi d'une date
C'est pour sauter tout le début du fichier jusqy'a cette ligne incluse.
ligne 11: next if (/^\s*$/);
On saute les lignes vides ou composées de blancs (si on en trouve)
ligne 13: $h = 0 + grep {!/^(default)?$/} map {s/^\s+|\s+$//g; $_} split(/,/, $_);
Faut prendre ça dans l'ordre
split(/,/, $_): On découpe le ligne d'entrée, selon les virgules, en un array
map {s/^\s+|\s+$//g; $_}: On vire les espaces au début et a la fin des éléments de l'array (on a donc un array dont les champs ont été "nettoyés" à la suite de cela)
grep {!/^(default)?$/}: on filtre l'array pour ne garder que les entrées non vides et non égales à default
0 + ... si on ajoute 0 à un array, ça renvoie le nb d'éléments de l'array.
Donc au final on a compté les champs entre virgule de la ligne initiale qui ne sont ni vides ni égaux à default.
Note: dans map {s/^\s+|\s+$//g; $_} le $_ final sert a réévaluer $_ après son nettoyage (des blancs) et le renvoyer comme valeur (pour chaque élément de l'array).
A+,
Marsh Posté le 08-06-2015 à 23:06:02
La ligne 9 avance dans le fichier jusqu'à la ligne satisfaisant le regex, soit dans l'exemple 20150606 00:23:41.
La ligne 11 c'est pour ignorer les lignes blanches: Entre le début ^ et la fin $ il n'y a que zéro ou un ou plusieurs * blancs \s (espace, tab).
La ligne 13 c'est bien trop difficile pour moi...
edit: ok, trop lent...
Marsh Posté le 09-06-2015 à 11:33:30
ReplyMarsh Posté le 25-06-2015 à 12:10:00
Henri772 a écrit : Tres gentil de votre part |
Salut a tous j'ai un autre probleme, j'ai un code dont je ne comprend pas ce qui ce passe car il ne me donne les resultats souhaite en prennant compte du DATA que j'avais deja eu a donne plus haut .
j'aimerai qu'il me donne la liste des Parametres ca veut dire tous les noms se trouvant devant "default" sur la horizontal et tous les noms des systemes se trouvant en dessous de de "default" donc sur la ligne le mon "fault" apparaitrai. en principe le code donc je possede devrait tout de meme deja me donne la liste des noms se trouvant sous la vertical a "default" mais malheureusement c'est pas le cas il ne me revoi rien .regardez un peu
Code :
|
Marsh Posté le 25-06-2015 à 21:36:50
Ça marche pas entre autres parce que les lignes que tu as données en exemple sont de la forme
doc10, 5 fault, 7 8 9 10 disallow,
doc11, 5 fault, 7 8 9 10 disallow,
doc12, 5 fault, 7 8 9 10 disallow,
doc13, 5 fault, 7 8 9 10 disallow,
doc14, 5 fault, 7 8 9 10 disallow,
Et chez moi, chacune de ces lignes n'a que 3 champs quand on fait un split sur les virgules.
Alors il manque des virgules dans ton exemple, ou ton CSV n'en est pas vraiment un?
Bon, en remplaçant la regexp de ton split:
my ($file, @fields) = split /\s*,\s*|\s+/;
ça pourrait coller s'il y a pas de blanc dans tes noms de documents.
A+,
Marsh Posté le 26-06-2015 à 06:13:41
gilou a écrit : Ça marche pas entre autres parce que les lignes que tu as données en exemple sont de la forme |
Salut Gilou,
j'ai un notre script perl qui parse les fichiers c'est lui qui me revoit le DATA plus haut et j'ai remarque, lorsqu'il parse et rencontre un chiffre il ne met pas virgule apres celui ci. moi meme je sais pas ce qui se passe a ce niveau. voila ou ce passe le parsage.
voila le niveau ou ce fait le parsage, peut etre tu peus me dire a quel niveau est le probleme. Plus bas tu veras a quoi ressemble l'un des fichier qu'il est capable de parser. Merci bien
Code :
|
Code :
|
Marsh Posté le 26-06-2015 à 06:30:58
Parlant du premier probleme donc j'ai enonce et donc tu as meme copier une partie qui ne tenait pas a savoir
doc10, 5 fault, 7 8 9 10 disallow,
doc11, 5 fault, 7 8 9 10 disallow,
doc12, 5 fault, 7 8 9 10 disallow,
doc13, 5 fault, 7 8 9 10 disallow,
doc14, 5 fault, 7 8 9 10 disallow,
normalement mon script ne devrai pas alle jusqu'a l'interieur de ce Data il sence traite la premiere ligne d'ou "default" est ecrit et me renvoyer tous les noms de parametre se trouvant excepte "default"dans le cas se serai: primary, secondary, copy_directory, forced_copy_flag, always_allow_dump, type_of_dump, full_memory_dump.
Ensuite alle traite ligne apres ligne en dessous de "default" garde a chaque fois le premier nom dans le cas de'espece se serai: doc10, doc11,doc12, doc13...doc54.
donc c'est un peu cela.
Marsh Posté le 26-06-2015 à 10:43:33
j'ai un peut mit de temps pour te confirmer effectivement ca marche quand on remplace le regex par my ($file, @fields) = split /\s*,\s*|\s+/;
mais normalement il devrai y avoir des virgules apres ses chiffres. comme je l'ai dit par ailleur je ne sais pas ce qui ce passe quand je parse les fichiers.
Marsh Posté le 26-06-2015 à 11:33:55
> print $FhResult $attr_value . ", ";
Je n'ai pas le temps de tester, alors je répond à vue, mais ça devrait être print $FhResult $attr_value, ", ";
avec une virgule et non un point.
Et si tu as alors des virgules partout en sortie, utilises
my ($file, @fields) = split /\s*,\s*/;
Ça splittera selon les virgules et de plus ça virera les blancs autour des champs.
A+,
Marsh Posté le 26-06-2015 à 11:39:47
twig_handlers => { |
Ça dit juste que quand on rencontre l'élément Parameter, on écrit en sortie la valeur de l'attribut value porté par cet élément, suivi d'une virgule.
A+,
Marsh Posté le 26-06-2015 à 21:30:49
J#ai oubli de mensionne un detail lorsque le fichier de sortie est de type csv apres les chiffres, il ya pas de virgule mais lorsquIl est de Type txt la il ya les virgule apres les chiffres. comment peut on explique cela
Marsh Posté le 26-06-2015 à 21:42:34
ou alors ca revient a simple logique Mathematique csv et une feuille de calcul et une virgule apres un chiffre suivi de 0 ou rien revient juste au chiffre. pour m'explique :
1,0 =1
1, =1
donc csv supprime automatique la virgule mais est-il possible d'oblige csv d'accepte une virgule un chiffre ? c'est ca le probleme
Marsh Posté le 27-06-2015 à 10:05:30
Henri772 a écrit : J#ai oubli de mensionne un detail lorsque le fichier de sortie est de type csv apres les chiffres, il ya pas de virgule mais lorsquIl est de Type txt la il ya les virgule apres les chiffres. comment peut on explique cela |
Si vous ne donnez aucune info sur la manière dont chacun des formats est généré, je ne risque pas de pouvoir vous répondre, même avec l'utilisation de boules de cristal et de M.arc de café.
A+,
Marsh Posté le 27-06-2015 à 15:34:49
Avec la virgule ou le point a ce niveau > print $FhResult $attr_value . ", "; cela ne change malheureusement pas le resultat. d'apres mon avis comme je l'ai deja souligne je pense c'est le fait que csv est une feuille de calcul et un chiffre suivit juste d'une virgule, sans un chiffre apres la virgule, la virgule sera automatiquement supprime
Marsh Posté le 27-06-2015 à 18:26:01
Henri772 a écrit : Avec la virgule ou le point a ce niveau > print $FhResult $attr_value . ", "; cela ne change malheureusement pas le resultat. d'apres mon avis comme je l'ai deja souligne je pense c'est le fait que csv est une feuille de calcul et un chiffre suivit juste d'une virgule, sans un chiffre apres la virgule, la virgule sera automatiquement supprime |
A moins que vous n'ayez du code spécifique autre que le code Twig que vous avez indiqué, il n'y a aucune raison.
D'autre part, j'ai testé le code Twig que vous avez posté, avec les données que vous avez fourni plus haut.
Il marche parfaitement, avec un . ou une , (mais la , est plus sure d'emploi dans ce contexte) et fournit une ligne correcte avec des virgules partout.
Donc manifestement, lorsque vous avez un export incorrect, ça ne semble pas passer par ce code ou bien le code que vous avez fourni est incomplet.
D'autre part, pour le code Twig, ceci serait bien préférable:
Code :
|
A+,
Marsh Posté le 02-07-2015 à 13:06:26
ReplyMarsh Posté le 03-07-2015 à 15:03:01
Henri772 a écrit : Merci bien Gilou de ton Aide et de tes propositions |
Salut Gilou,
encore une aide de ta part en prenant reference au Data plus haut lorsque j'execute ce code il me fourni
default, primary, secondary, copy_directory, forced_copy_flag, always_allow_dump, type_of_dump, full_memory_dump,
j'aimerai qu'il ignore ou saute le mot "default" et me retourne dans cet ordre:
primary
secondary
copy_directory
forced_copy_flag
always_allow_dump
type_of_dump
full_memory_dump
Code :
|
Marsh Posté le 03-07-2015 à 18:23:58
Au lieu de
if ($. == 2) {
print "$_\n";
}
faire
if ($. == 2) {
s/^default,\s*//; # on efface le début
print "$_\n";
}
A+,
Marsh Posté le 06-07-2015 à 04:36:54
Bonjour Gilou,
j'ai essaye d'ameliorer le code plus bas mais lorsqu'il me revoit la liste des parametres, il ya une ligne vide plus bas qu'elle revoit aussi, comment faire pour supprimer cette ligne vide car elle me derrange. en voila un appercu de la sortie plus bas.
Merci bien
Code :
|
C:\Users\Henri\Documents\probe>perl woerterlisten.pl DATA.csv
primary
secondary
copy_directory
forced_copy_flag
always_allow_dump
type_of_dump
full_memory_dump
C:\Users\Henri\Documents\probe>
Marsh Posté le 06-07-2015 à 12:01:53
J'aurais fait ceci:
Code :
|
A+,
Marsh Posté le 06-07-2015 à 19:41:34
Merci bien de ta propositon c'est tres Gentil
Bonjour Gilou,
une fois de plus j'ai un code qui fonctionne bien jusqu'ici mais avec cela il es un peu faciöe de se perdre, j'aimerai que tu m'aide a separer cela de maniere a ce que plus haut j'ai mon code perl et plus bas mon print html ainsi je pense qu'il sera facile pour qu'un de s'y retrouve facile. comme je l'ai dit le code fonctionne parfaitement j'aimerai juste d'un cote perl et de l'autre print hml. Merci bien , Apropos j'ai une derniere question comme faire lorsque j'ai plusieurs code-perl que j'aimerai en faire ce un seul grand-code, car plustard j'aimerai plus avoir une separation total du code html des Code perl, et ainsi proceder par la methode d'appel. c'est un peu cela mon probleme Merci bien de ton Aide et bonne journee.
Code :
|
Marsh Posté le 08-07-2015 à 11:32:06
gilou a écrit : J'aurais fait ceci:
|
Bonjour Gilou,
Laisse tomber le probleme d'hier,
jaimerai que tu m'aides comment faire a ce sie je tape un document il m'affiche les parametres correspondants. Sachant que nous avons deja le code ci dessus qui nous affiche les parametres. toujours en reference avec notre DATA plus haut , ceci donnerai
sie je tape d100spuptl25e0, tenant biensur compte que les noms des parametres du "default" sont les memes. je recois:
default d100spuptl25e0
primary /dev/lg_dumplv
secondary /dev/sysdumpnull
copy_directory /var/adm/ras
forced_copy_flag 1
always_allow_dump 1
type_of_dump fault
full_memory_dump disallow
si je tape doc10 je recois
default doc10
primary 5
secondary fault
copy_directory 7
forced_copy_flag 8
always_allow_dump 9
type_of_dump 10
full_memory_dump disallow
et ainsi de suite. Merci bien de ton aide a+
Marsh Posté le 08-07-2015 à 12:14:08
Je te dirai cela ce soir ou demain, je suis pris toute la journée d'aujourd'hui.
L'idée de base c'est de mémoriser les infos dans un hash qui a pour clé ton nom de document.
A+,
Marsh Posté le 08-07-2015 à 16:50:56
Henri772 a écrit : Merci bien de ta propositon c'est tres Gentil |
Code :
|
J'ai repris ton code juste en le réordonnant afin
1) d'imprimer tout dans le fichier html d'un coup
2) de parser une seule fois et non pas deux le fichier source
3) faudra améliorer la génération de tes liens: <a href=\"http://www.erp4students.de/\"> -> <a href=\"http://www.erp4students.de/.......\">
A+,
Marsh Posté le 08-07-2015 à 19:15:08
Henri772 a écrit : |
Code :
|
En sortie:
.................................... |
A toi d'adapter pour avoir un dialogue interactif avec juste un seul résultat au lieu de tout lister.
A+,
Marsh Posté le 08-07-2015 à 22:48:26
Wooo Gilou c'est extremement gentil de ta part .
mes sinceres remerciments
Marsh Posté le 09-07-2015 à 13:11:34
Bonjour une fois de plus merci pour ton aide j'ai une question sur le dernier code: pardon ces ligne je ne comprend pas
foreach parcours la liste c'est le 0..$#headers que je ne comprend pas et en suite la ligne printf.
foreach (0..$#headers) {
printf("%18s : %s\n", $headers[$_], $docs{$doc}->[$_]);
Marsh Posté le 09-07-2015 à 14:15:54
s'il te plait ou insere mon split pour un decoupage en plusieurs fichiers
c'est a dire lors qu'il me revoit les donnes d'un document il les ecrit sur un fichier f1 le decoupe et le sauvegarde et passe a l'autre document ecrit les donnes sur le second fichier f2 le decoupe et sauvegade et ainsi de suite jusqu'a ce qu'il me renvoi les fichiers des de chaque document.
Marsh Posté le 09-07-2015 à 14:18:26
> foreach (0..$#headers)
Ben la liste @header a pour indice de début 0 et indice de fin $#headers
Donc on parcourt les indices de la liste. (ie on va parcourir la liste en faisant varier l'indice de ses éléments)
> $headers[$_]
C'est l'élément de liste @header d'indice $_,ie la valeur courante du foreach (0..$#headers)
> $docs{$doc}->[$_]
%doc est un hash dont les clés sont les noms des documents et les valeurs des références a des listes, dont l'indice varie lui aussi, par construction, de 0 à $#headers.
$docs{$doc} est la référence au la liste associée au document $doc
$docs{$doc}-> on déréférence (on a donc la liste)
$docs{$doc}->[$_] on a la valeur de la liste d'indice $_
Note: j'aurais pu écrire @{$docs{$doc}}[$_] à la place de $docs{$doc}->[$_]. Avec cette notation, le déréférencement de $docs{$doc} en liste est explicite: @{$docs{$doc}}
A+,
Marsh Posté le 09-07-2015 à 14:26:49
Henri772 a écrit : s'il te plait ou insere mon split pour un decoupage en plusieurs fichiers |
C'est pas très clair.
Tu veux dire qu'un truc comme ceci:
doc51: |
se retrouverait dans 3 fichiers?
Faut faire un truc comme:
foreach my $doc (keys %docs) {
open my $fh, ">", 'un nouveau nom a chaque tour.txt',
print $fh "$doc:\n";
foreach (0..$#headers) {
printf($fh "%18s : %s\n", $headers[$_], $docs{$doc}->[$_]);
}
print $fh "\n";
close $fh;
}
A+,
Marsh Posté le 09-07-2015 à 15:30:35
gilou a écrit : C'est pas très clair.
se retrouverait dans 3 fichiers? |
une fois de plus merci , mais au niveau de foreach (0..$#headers) je n'ai pas cette essaye , pouvait-on ecrire foreach (@headers) {
printf($fh "%18s : %s\n", $headers[$_], $docs{$doc}->[$_]);
}
en ce qui concerne les fichiers de sortie j'aimerai qu'il me revois du genre :
fichier1:
doc51: |
fichier2:
|
fichier3:
|
en plusieurs et ainsi de suite.
Salut, je me permet de te derrange une fois de plus comment faire a ce que ce code me renvoit chaque document sur un fichier de sortie, exactement comme en haut de ce message.
Code :
|
Marsh Posté le 08-06-2015 à 11:38:20
Salut a tous,
j'aimerai savoir comment compter sur l vertical et l'horizontal en perl ce qui me rend la tache difficile c'est parceque sur mon fichier d'entree il ya des conditions a respecter, je me resume plus clairement:
DATA:
Informations:
pere, Ami, Somi, Soul, Gari, Paul, piere
tata,
toto,
titi,
tete,
tutu,
la ligne avec "Informations" ne doit pas etre concidere, le nom "pere" ne doit etre concidere dans les comptage que ce soit sur la vertical comme sur l'Horizontal.
dans cet exemple le resultat devrais etre: Horizontal 6 mots et la vertical 5 mots.
Merci bien de votre aide