Vous n'êtes pas identifié(e).
Pages : 1
Autovivification : Sous ce terme barbare se cache une idée simple : si vous tentez de modifier un élément d'une table de hachage qui n'existe pas, il sera créé. S'il est utilisé dans un contexte numérique, il prendra pour valeur initiale zéro. S'il est utilisé dans un contexte de chaîne de caractères, il prendra pour valeur la chaîne vide (depuis Perl 5.6).
Mon programme (idée) serait de mettre en correspondance des éléments avec des valeurs, comme ses éléments sont uniques j'ai pensé à tables de hachages (avec couple clé/valeurs je l'ai fait ça marche bien);
la dénomination des éléments étant inconnu lors du lancement du programme j'ai plusieurs fichiers et les éléments de l'un ne seront pas forcément les éléments de l'autre.
EX: fic_1 contient les éléments :Pomme, banane,poire, banane (au final Pomme=1, banane=2, poire=1)
fic_2 contient les éléments suivant: ananas, pomme, fraise (au final pomme=1, ananas=1, fraise=1)
l'autovivification me permettrait de ne pas avoir de listes pré-établie, et à ma connaissance seul Perl est capable de le faire, mais comme j'ai commencer à faire un script bash, ça m'ennuie (c'est pas très esthétique) d'appeler un programme perl.
Question n°1: Puis je faire de l'autovivification en bash?
Question n°2: Puis je faire du sed en Perl ? (si la réponse à la question 1 est négative)
Question n°3: Les données une fois analyser seront dans un fichier, comme les données sont (dans mon esprit) en arbre binaire quel est le meilleur type de fichier sachant que après ses données pourraient aller dans une base Sqlite ou mis en forme dans un tableau HTML? Moi après le CSV je pensais a du XML...
PS: surtout que dans le script bash j'appelle un script sed pour mettre en forme un fichiers initial..
Oui, je pourrais faire une boucle for d'un tableau élément pour voir si y'a pas de doublons mais ça alourdirait le code (la lisibilité)
Merci à vous
La difficulté est source d'apprentissage
Hors ligne
La difficulté est source d'apprentissage
Hors ligne
saque eud dun (patois chtimi : fonce dedans)
Hors ligne
smolski bonjour smolski .
L'autovivification va te dire
smolski => 2
bonjour =>1
si ça t'intéresse je te conseillehttp://formation-perl.fr/ au chapitre 6 (de Sylvain Lhullier)
Dernière modification par Spirale21 (14-02-2016 20:58:33)
La difficulté est source d'apprentissage
Hors ligne
saque eud dun (patois chtimi : fonce dedans)
Hors ligne
Alors après recherche intensive je ne crois pas que le bash fasse de l'autovivification.
De toute façon, la gestion des tableau associatif (comme on les appelle dans bash) est assez limitée.
Mais ton exemple peut être fait en bash :
Honnêtement, en bash, je trouve cela très bizarre, perl est bien plus simple
Hors ligne
Honnêtement, en bash, je trouve cela très bizarre, perl est bien plus simple
Pareil (c'est pour ça que j'utilise perl, Bash alourdit le code) mais pour le traitement des fichiers texte je trouve que les outils GNU sont très puissant (et les shells) et qu'on peut se passer de Perl.
La difficulté est source d'apprentissage
Hors ligne
Un moyen simple d'initialiser un tableau indicé avec ces valeurs est :
Cela va créer le tableau fruits, après il facile de compter les
éléments avec la méthode que j'ai indiquée dans le post #6
L'option -t demande à mapfile de supprimer le caractère fin de ligne.
Sinon mapfile laisse ce caractère ce qui n'est pas forcément ce qu'on souhaite.
On peut même initialiser un tableau de mots à partir d'une chaîne :
Le « IFS=$' ' » permet de demander de découper les mots séparés par
une espace. Je l'ai mis sur la même ligne que le « read -a tfruits… »
pour que cette valeur soit locale pour la commande « read… ».
Ensuite, la valeur de IFS retrouve sa valeur par défaut.
Tu peux en lire d'avantage à ce sujet ici :
http://mywiki.wooledge.org/BashGuide/Arrays
Évidemment, en bash c'est toujours assez cryptique
Dernière modification par enicar (15-02-2016 11:35:22)
Hors ligne
Question n°2: Puis je faire du sed en Perl ? (si la réponse à la question 1 est négative)
Non, pas vraiment, mais il n'y en a pas besoin en principe. Il suffit de faire
différemment. Il faudrait que tu donnes un exemple de commande sed que
tu veux utiliser pour être plus précis.
Hors ligne
/REF/{N;s/\n//g}
/PPL/{N;s/\n//g}
/^$/{N;s/\n//g}
s/ PPL/PPL/g
s/ REF/REF/g
s/[0-9]\{1,3\}h[0-9]\{2\}//g
s/^[[:space:]]//g
# --- On oublie pas l'entête ---
1,/[0-9][0-9]*/d
bien sûr il n'est pas optimiser... en fait il y a trois lignes (qui doivent se répéter 40 fois)
XXX <- entête à supprimer
Nom
PPL X Y Z E pomme poire
REF poire pomme ananas
XXXX <- re entête
PPL A B C
REF B N J
La difficulté est source d'apprentissage
Hors ligne
Qui dit a sed : si il y a une ligne vide en entrée, tu ajoutes la lignes suivante qui est en entrée
puis tu supprimes tous les « \n »… Donc cela veut dire que tu ajoutes toute ligne qui est
précédée d'une ligne vide indépendamment de ce qu'elle contient. Ce qui est bizarre par rapport
à l'exemple de données à traiter que tu fournis (et qui ne doit pas être représentatif).
J'ai l'impression que tu veux mettre chaque enregistrement sur une seule ligne au lieu de plusieurs.
Est-ce cela ?
Dernière modification par enicar (16-02-2016 21:28:53)
Hors ligne
et justement j'ai pas pris Perl car je ne sais pas joindre PPL (ou REF) et la ligne suivante le
/^$/{N;s/\n//g}
de sed)
imagine que ton fichier doit donner 12 fichiers distinct (1 par mois) chacun de ses fichier étant entre les deux entêtes... et l'histoire des entêtes aussi je savais pas faire en perl et ouvrir et fermer 12 fichiers.. bref sed me parait plus simple et awk pour mon fichier CSV. Mon fichier CSV doit être lisible par un humain être mis dans une page HTML et dans une base de données et un tableur (style excel ou calc)
Dernière modification par Spirale21 (16-02-2016 21:59:27)
La difficulté est source d'apprentissage
Hors ligne
Hors ligne
Ce code est écrit volontairement sans astuces pour être facilement
compréhensible. Si il y a besoin, n'hésite pas à demander des explications
Enfin, c'est juste un exemple, ce programme n'est pas destiné à être
utilisé en production. D'autant que je ne sois pas sûr qu'il marche.
On doit pouvoir faire nettement mieux, mais bon…
Dernière modification par enicar (17-02-2016 12:10:08)
Hors ligne
La difficulté est source d'apprentissage
Hors ligne
$status c pareil que $state?
Oui, je me suis trompé, mais c'est corrigé
Oui faut le modifier car l'entête fait à peut près 15 lignes...
Et bien dans ton script sed tu ne tiens pas compte du nombre de lignes, mais
tu vires tout ce qu'il y a entre la première ligne le motif « /[0-9]+/ ». Et c'est ce que devrais faire
mon script, il me semble.
je savais pas que m// pouvait être utilisé sans l'opérateur de correspondance =~ mais juste en condition.
Quand tu l'utilises sans l'opérateur =~, il est sous entendu. « /REF/ » est équivalent à « $_ =~ /REF/ ».
De même : while (<FIK>) » est équivalent à « while ($_ = <FIK>) », qui permet de lire une ligne
en entrée et de la stocker dans $_.
En principe, ce sont mêmes des raccourcis qu'il ne faut pas trop utiliser, mais là je voulais
écrire un truc vite fait
On peut faire complétement différemment et se passer de la variable $state, mais alors
il faut surveiller que l'on est pas en fin de fichier avec eof. (Mais ce n'est pas
très perlish )
Si ton entête fait toujours le même nombre de lignes, il est possible d'utiliser une autre technique pour
la sauter, en utilisant la variable $. (appelé aussi $INPUT_LINE_NUMBER).
Note que j'ai utilisé $" ($LIST_SEPARATOR) qui est le caractère utilisé comme
séparateur pour les tableaux interpolé dans les chaînes entre ". On peut aussi utiliser join,
mais bon, j'ai utilisé quelques raccourcis commodes de perl
Dernière modification par enicar (17-02-2016 12:42:12)
Hors ligne
if /REF/ ct pareil que if ($_=~m/REF/)
Purée t'es trop fort.. moi j'ai galérer pendant 3 jours et toi en un soir tu le fais.... chapeau bas!! c'est là que moi je pleures quand je vois le chemin à parcourir pour jongler avec les fondamentaux du langages... c pour ça que j'ai choisit perl pour sa puissance dans le traitement des chaines de caractères (aussi parce que c livré par défaut sur GNU Linux..;)).
Et Ruby c puissant comme langage? si tu devais donner un de ses domaines de prédilections tu dirais koi?
Comme je t'ai sous la main.:lol: si je te dit langages de statistique descriptive (genre moyenne, écart type, variance, médiane), on peut le faire avec perl (c conseillé)? Et pour la programmation genre socket et réseaux on peut prendre perl?
La difficulté est source d'apprentissage
Hors ligne
Je vais peut être être pointilleux mais entre les entêtes y'a plein de noms différents et quand tu ouvres le fichiers d'un mois tu l'ouvres en écrasant donc le PPL du 2e nom va écraser le PPL du premier nom?
Et bien, ce n'était pas dans le cahier des charges… mais c'est facile
d'ouvrir les fichiers en mode mise à jour pour rajouter le nouvel
enregistrement à la fin. Pour faire cela, au lieu de faire :
On fait :
Le > et le >> correspondent tous les deux au même signes utilisés avec
le shell pour les redirections, et pour les mêmes fonctionnalités.
Purée t'es trop fort.. moi j'ai galérer pendant 3 jours et toi en un soir tu le fais.... chapeau bas!!
Pas du tout, je connais perl depuis 1998, même si je n'en fais plus et
qu'il faut que je regarde dans mon camel book et dans mes anciens
programmes pour voir comment ça fonctionne
Et Ruby c puissant comme langage? si tu devais donner un de ses domaines de prédilections tu dirais koi?
Ruby ressemble pas mal à perl sous bien des aspects, toutefois le
langage est entièrement objet. Cela simplifie bien l'écriture et la
lecture du code. Le créateur de ruby a copié pas mal de choses de perl
tout en adoptant une système de classe qui fait penser à smalltalk, si
ça te parle… Le domaine de prédilection est le même que perl à peu de
choses près.
Comme je t'ai sous la main.:lol: si je te dit langages de statistique descriptive (genre moyenne, écart type, variance, médiane), on peut le faire avec perl (c conseillé)?
On peut probablement le faire en perl, regarde sur le CPAN s'il existe
des modules pour cela. Mais pour faire des statistiques, il y a un
langage spécialisé le R. Je ne connais pas du tout.
Et pour la programmation genre socket et réseaux on peut prendre perl?
Oui, on peut utiliser perl, mais on peut aussi le faire en ruby ou en
python. Python3 est très bien pour faire de gros projet. Évidemment,
on ne bénéficie pas des raccourcis perl en python ou en ruby, mais
ces langages ont d'autres moyens d'être très expressifs également.
Remarque que Larry Wall a créé perl justement pour pouvoir avoir
plus de facilité dans la programmation réseau que awk, notamment.
Pour finir, on peut vraiment faire des choses plus élaborées avec perl
en définissant des classes, etc… mais ça rien d'obligatoire.
Hors ligne
Hors ligne
Hors ligne
Hors ligne
La difficulté est source d'apprentissage
Hors ligne
Pages : 1