Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Script manipulant du texte en se servant d'un csv

6 réponses
Avatar
Francois
Bonjour à tous,

J'ai un fait un script (ici http://sisco.laf.free.fr/modele2cible.txt)
qui doit me permettre de répondre à un problème que je rencontre de
manière récurrente. Je m'explique. J'utilise LaTeX pour faire des
documents pdf et souvent je suis amené à répéter du code LaTeX.

------------------------
1) Ce que fait le script
------------------------

J'ai un fichier de données que je vais appeler "donnees" qui est un
fichier csv issu d'un tableur. Par exemple :

----------------
Martin;Jean;35
Durant;Pierre;43
Dupont;Guy;20
...etc...
----------------

Il correspond à un tableau (exporté en csv) constitué de trois champs
qui sont dans cet exemple __nom__, __prenom__ et __age__.

J'ai un autre fichier que j'appelle "modele" qui est en fait un bout de
code LaTeX qui sera de la forme :

----------------
Blabla blabla blabla blabla
__nom__ __prenom__ blabla
blabla blabla blabla blabla
__age__ blabla blabla blabla
blabla blabla blabla blabla
__nom__ blabla blabla blabla
blabla blabla blabla.
----------------

(en fait, les "blabla" c'est souvent des truc avec dec "\" partout et
des "{" etc. Bref du code LaTeX.)

L'idée, bien sûr, c'est que le script va générer un gros fichier qui
sera les "modeles" mis bout à bout sauf que les __champs__ seront
remplacés par les valeurs d'une ligne du fichier "donnees". Dans mon
exemple, ça donnerait :

----------------
Blabla blabla blabla blabla
Martin Jean blabla
blabla blabla blabla blabla
35 blabla blabla blabla
blabla blabla blabla blabla
Martin blabla blabla blabla
blabla blabla blabla.

Blabla blabla blabla blabla
Durant Pierre blabla
blabla blabla blabla blabla
43 blabla blabla blabla
blabla blabla blabla blabla
Durant blabla blabla blabla
blabla blabla blabla.

Blabla blabla blabla blabla
Dupont Guy blabla
blabla blabla blabla blabla
20 blabla blabla blabla
blabla blabla blabla blabla
Dupont blabla blabla blabla
blabla blabla blabla.

... etc ...
----------------

Ce problème est récurrent dans le sens où les données peuvent changer
(ainsi que le nom des champs) et le modèle aussi.

----------------
2) Mes questions
----------------

Je sais qu'il existe un module csv qui doit sûrement simplifier le
problème, mais j'ai voulu faire ce script aussi un peu comme un exercice
aussi.

C'est surtout d'un point de vue conception que je me pose des questions.
J'ai voulu faire un truc un peu OO, mais je n'y arrive pas bien, j'ai
l'impression de mélanger le procédural et l'OO. D'ailleurs, je me
demandais si mon problème était un problème adapté à l'OO. Bref, est-ce
adapté de faire un code OO pour ce problème et comment faire (si oui) ?

Sur mon PC, tout est en Utf-8. Comment peut-on gérer le fait que ça
génère ou non (en fonction de ce que l'on souhaite) du Latin1 ?

Même si ce n'est pas le but initial de mon fil, toutes autres remarques
sur le script sont les bienvenues également : remarques formelles,
remarques sur l'aspect optimisation mémoire (que je n'ai pas du tout
pris en compte étant donnée la faible taille de mes fichiers "modele" et
"donnees"), etc. bref toutes autres remarques m'intéressent aussi.


En espérant avoir été clair. Merci d'avance pour votre aide.


--
François Lafont

6 réponses

Avatar
Bruno Desthuilliers
Francois a écrit :
Bonjour à tous,

J'ai un fait un script (ici http://sisco.laf.free.fr/modele2cible.txt)
qui doit me permettre de répondre à un problème que je rencontre de
manière récurrente. Je m'explique. J'utilise LaTeX pour faire des
documents pdf et souvent je suis amené à répéter du code LaTeX.

------------------------
1) Ce que fait le script
------------------------

J'ai un fichier de données que je vais appeler "donnees" qui est un
fichier csv issu d'un tableur. Par exemple :



(snip)

Il correspond à un tableau (exporté en csv)



"exporté" à partir de quoi ?


J'ai un autre fichier que j'appelle "modele" qui est en fait un bout de
code LaTeX qui sera de la forme :



(snip)

L'idée, bien sûr, c'est que le script va générer un gros fichier qui
sera les "modeles" mis bout à bout sauf que les __champs__ seront
remplacés par les valeurs d'une ligne du fichier "donnees".



En bref, c'est un système de template. Pour info, une bonne part des
systèmes de template existant, même s'ils sont avant tout utilisés pour
générer du HTML, peuvent générer n'importe quel type de format texte.

Ce problème est récurrent dans le sens où les données peuvent changer
(ainsi que le nom des champs) et le modèle aussi.

----------------
2) Mes questions
----------------

Je sais qu'il existe un module csv qui doit sûrement simplifier le
problème, mais j'ai voulu faire ce script aussi un peu comme un exercice
aussi.

C'est surtout d'un point de vue conception que je me pose des questions.
J'ai voulu faire un truc un peu OO, mais je n'y arrive pas bien, j'ai
l'impression de mélanger le procédural et l'OO. D'ailleurs, je me
demandais si mon problème était un problème adapté à l'OO. Bref, est-ce
adapté de faire un code OO pour ce problème et comment faire (si oui) ?



Regarde comment fonctionne des systèmes comme Mako, Jinja ou Cheetah.

Sur mon PC, tout est en Utf-8. Comment peut-on gérer le fait que ça
génère ou non (en fonction de ce que l'on souhaite) du Latin1 ?



s = "some string"
s.decode("utf-8").encode("latin-1")

Même si ce n'est pas le but initial de mon fil, toutes autres remarques
sur le script sont les bienvenues également : remarques formelles,
remarques sur l'aspect optimisation mémoire (que je n'ai pas du tout
pris en compte étant donnée la faible taille de mes fichiers "modele" et
"donnees"), etc. bref toutes autres remarques m'intéressent aussi.



Heu... Là je crois que je vais attendre d'être un peu reposé - j'ai
bouffé ma dose de code pour la journée, désolé !-)
Avatar
Francois
Bruno Desthuilliers a écrit :

Il correspond à un tableau (exporté en csv)



"exporté" à partir de quoi ?



En général à partir de fichiers-tableur OpenOffice (parfois Excel). Ce
sont en général des tableaux (ou fichier csv) qui ne dépassent guère la
centaine de lignes.

En bref, c'est un système de template. Pour info, une bonne part des
systèmes de template existant, même s'ils sont avant tout utilisés pour
générer du HTML, peuvent générer n'importe quel type de format texte.



Même du LaTeX ? Ok. En revanche le mot template pour moi, ça évoquait
seulement le code donnant l'aspect d'un site internet. Pour moi, ce mot
était réservé au web en fait. Mais effectivement, j'ai des données que
je veux afficher (dans un pdf dans mon cas, et via du code LaTeX).

C'est surtout d'un point de vue conception que je me pose des
questions. J'ai voulu faire un truc un peu OO, mais je n'y arrive pas
bien, j'ai l'impression de mélanger le procédural et l'OO. D'ailleurs,
je me demandais si mon problème était un problème adapté à l'OO. Bref,
est-ce adapté de faire un code OO pour ce problème et comment faire
(si oui) ?



Regarde comment fonctionne des systèmes comme Mako, Jinja ou Cheetah.



Et ben, jamais entendu parlé. Je regarderai.

Sur mon PC, tout est en Utf-8. Comment peut-on gérer le fait que ça
génère ou non (en fonction de ce que l'on souhaite) du Latin1 ?



s = "some string"
s.decode("utf-8").encode("latin-1")



Ah parfait.

Même si ce n'est pas le but initial de mon fil, toutes autres
remarques sur le script sont les bienvenues également : remarques
formelles, remarques sur l'aspect optimisation mémoire (que je n'ai
pas du tout pris en compte étant donnée la faible taille de mes
fichiers "modele" et "donnees"), etc. bref toutes autres remarques
m'intéressent aussi.



Heu... Là je crois que je vais attendre d'être un peu reposé - j'ai
bouffé ma dose de code pour la journée, désolé !-)



Ah, ça veut dire qu'à partir d'une certaine dose, on peut en avoir plein
le... dos ? :-) Il n'y pas de quoi être désolé bien sûr.


Merci de ton aide.


--
François Lafont
Avatar
Mihamina Rakotomandimby (R12y)
Francois wrote:
Heu... Là je crois que je vais attendre d'être un peu reposé - j'ai
bouffé ma dose de code pour la journée, désolé !-)



Ah, ça veut dire qu'à partir d'une certaine dose, on peut en avoir plein
le... dos ? :-) Il n'y pas de quoi être désolé bien sûr.



Le code fait mal au dos, oui... c'est vrai.
Avatar
Bruno Desthuilliers
Francois a écrit :
Bruno Desthuilliers a écrit :

Il correspond à un tableau (exporté en csv)



"exporté" à partir de quoi ?



En général à partir de fichiers-tableur OpenOffice (parfois Excel). Ce
sont en général des tableaux (ou fichier csv) qui ne dépassent guère la
centaine de lignes.

En bref, c'est un système de template. Pour info, une bonne part des
systèmes de template existant, même s'ils sont avant tout utilisés
pour générer du HTML, peuvent générer n'importe quel type de format
texte.



Même du LaTeX ?



C'est un langage de marquage dans un format texte, non ?

Ok. En revanche le mot template pour moi, ça évoquait
seulement le code donnant l'aspect d'un site internet. Pour moi, ce mot
était réservé au web en fait.



Certains systèmes de templates sont basés sur XML et ne génèrent que de
XML. Mais c'est loin d'être la majorité. Pour le reste, s'il est vrai
que la génération (dynamique) de pages HTML est le cas d'utilisation le
plus fréquent des systèmes de template, c'est loin - très loin - d'être
le seul. Pour ma part, j'avais apris le principe avec les systèmes de
modèles/fusions de documents sous MS Office (quelque part vers le milieu
du siècle dernier), puis avec les générateurs de rapports des applis de
gestion (CrystalReport & co). En ce qui concerne les systèmes que
j'utilise actuellement, même si ça reste avant tout dans le cadre du
developpement web, ça inclus aussi la génération de css, de javascript,
de mails, etc - bref de toute sorte de formats textes.


Mais effectivement, j'ai des données que
je veux afficher (dans un pdf dans mon cas, et via du code LaTeX).



Donc du LaTeX.

C'est surtout d'un point de vue conception que je me pose des
questions. J'ai voulu faire un truc un peu OO, mais je n'y arrive
pas bien, j'ai l'impression de mélanger le procédural et l'OO.
D'ailleurs, je me demandais si mon problème était un problème adapté
à l'OO. Bref, est-ce adapté de faire un code OO pour ce problème et
comment faire (si oui) ?



Regarde comment fonctionne des systèmes comme Mako, Jinja ou Cheetah.



Et ben, jamais entendu parlé. Je regarderai.



Sont tous en open source donc il y a pas mal à apprendre. Ceci étant, je
ne t'en ai cité que trois, mais il y en a un paquet d'autres - regarde
dans la section développement web de python.org pour d'autres solutions
possibles.

Sur mon PC, tout est en Utf-8. Comment peut-on gérer le fait que ça
génère ou non (en fonction de ce que l'on souhaite) du Latin1 ?



s = "some string"
s.decode("utf-8").encode("latin-1")



Ah parfait.



En général, la meilleure solution est de ne gérer en interne que de
l'unicode, donc en décodant (le template et les données) à l'entrée et
en decodant (le résultat) à la sortie.


Même si ce n'est pas le but initial de mon fil, toutes autres
remarques sur le script sont les bienvenues également : remarques
formelles, remarques sur l'aspect optimisation mémoire (que je n'ai
pas du tout pris en compte étant donnée la faible taille de mes
fichiers "modele" et "donnees"),







L'approche "flux/pipelines" est généralement la meilleure façon de gérer
cette problématique. Regarde du coté des itérateurs/générateurs.

etc. bref toutes autres remarques
m'intéressent aussi.



Heu... Là je crois que je vais attendre d'être un peu reposé - j'ai
bouffé ma dose de code pour la journée, désolé !-)



Ah, ça veut dire qu'à partir d'une certaine dose, on peut en avoir plein
le... dos ? :-)



ou plein le DOS, si on est adepte de MS. Pour ma part, en ce moment, je
serais plutôt un peu sur les GNU.

Bon, ok ------>[]
Avatar
Francois
Bonjour à tous et pardon pour ma réponse tardive, j'étais assez pris (là
c'est un peu mieux, forcément c'est le week-end).

En général, la meilleure solution est de ne gérer en interne que de
l'unicode, donc en décodant (le template et les données) à l'entrée et
en decodant (le résultat) à la sortie.



J'ai essayé de respecter ce principe (en espérant l'avoir bien compris).
Voici une nouvelle version de mon script, plus propre je crois et
surtout j'y ai mis des commentaires. Voici le source :

http://sisco.laf.free.fr/model2target.txt

ou plein le DOS, si on est adepte de MS. Pour ma part, en ce moment, je
serais plutôt un peu sur les GNU.



He he ! Pas mal. :-)


--
François Lafont
Avatar
Francois
Francois a écrit :

Voici une nouvelle version de mon script, plus propre je crois et
surtout j'y ai mis des commentaires. Voici le source :

http://sisco.laf.free.fr/model2target.txt



Peut-être que ça sera un plus agréable à lire avec un peu de coloration
syntaxique ici :
http://sisco.laf.free.fr/codes/model2target.html

--
François Lafont