Utilisation imbriquée de csvreader

l'utilisation de la commande de manière récurcive semble mettre en l'aire cerataines définitions internes

a marqué ce sujet comme résolu.
Auteur du sujet

Bonjour à tous.

Je suis en train d’essayer de faire un code latex qui lirait plusieurs fichiers csv pour faire une mise en page comme demandé dans un stage. La plupart des commandes que j’ai faites pour ça fonctionnent très bien mais je me heurte à un soucis: La commande \csvreader du paquet csvsimple ne semble pas supporter l’usage imbriqué.

Voilà les deux commandes incriminées:

%Appel principal
\useCaseCsv{fichier1.csv}{fichier2.csv}{pipe}{false}

%La commande useCaseCsv
\newcommand{\useCaseCsv}[4] % Template for a Use-Case csv file
% Parameter order: use-case’s csv; requirement’s csv ; separator; header
%Value for separator: comma; semicolon; pipe; tab
%Value for header: true; false
%The order of the use-case’s csv should be: reference; version; name; complexity; priority; description; actors
%The order of the requirement’s csv should be: reference; version; test method; description ; parent; justification ; type of connection with the use-case
%The type of connection can have the value: Precondition; MainFlow; AlternativeFlow; Postcondition
%The csv must be ordered
{{
    \csvreader[separator=#3,head=#4,respect all]{#1}{1=\refe,2=\ver,3=\name,4=\comp,5=\prio,6=\desc,7=\actor}
      {\useCase{\refe}{\ver}{\name}{\comp}{\prio}{\desc}{\actor}{#2}{#3}
}}

%La commande useCase:
\newcommand{\useCase}[9] % Template for a use-case 
% Parameter order: reference; version; name; complexity; priority; description; actors; requirement’s csv; separator
%Value for separator: comma; semicolon; pipe; tab
%The order of the .csv should be: reference; version; test method; description ; parent; justification ; type of connection with the use-case
%The type of connection can have the value: Precondition; MainFlow; AlternativeFlow; Postcondition
%The csv must be ordered
{{
    \newline#1\_V#2~#3
    \newline\textbf{Complexity:}~#4\hfill\textbf{Priority:}~#5
    \newline
    \newline\textbf{GlobalDescription:}~#6
    \newline
    \newline\textbf{Actor:}\{~#7\}
    \newline
    \newline\textbf{Precondition:}~
    \newline\csvreader[separator=#9,head=false,respect all,filter expr={
              test{\IfSubStr{\refe}{#1}} and 
              test{\ifcsvstrcmp{\type}{Precondition}}
              }]{#8}
              {1=\refe,2=\ver,3=\test,4=\desc,5=\hl,6=\justi,7=\type}
              {\requirement{\StrBehind{\refe}{#1}}{\ver}{\test}{\desc}{\hl}{\justi}}
    \newline\newline\textbf{Main Flow:}~
    \newline\csvreader[separator=#9,head=false,respect all,filter expr={
              test{\IfSubStr{\refe}{#1}} and 
              test{\ifcsvstrcmp{\type}{MainFlow}}
              }]{#8}
              {1=\refe,2=\ver,3=\test,4=\desc,5=\hl,6=\justi,7=\type}
              {\requirement{\StrBehind{\refe}{#1}}{\ver}{\test}{\desc}{\hl}{\justi}}
    \newline\newline\textbf{Alternative Flow:}~
    \newline\csvreader[separator=#9,head=false,respect all,filter expr={
              test{\IfSubStr{\refe}{#1}} and 
              test{\ifcsvstrcmp{\type}{AlternativeFlow}}
              }]{#8}
              {1=\refe,2=\ver,3=\test,4=\desc,5=\hl,6=\justi,7=\type}
              {\requirement{\StrBehind{\refe}{#1}}{\ver}{\test}{\desc}{\hl}{\justi}}
    \newline\newline\textbf{Postcondition:}~
    \newline\csvreader[separator=#9,head=false,respect all,filter expr={
              test{\IfSubStr{\refe}{#1}} and 
              test{\ifcsvstrcmp{\type}{Postcondition}}
              }]{#8}
             {1=\refe,2=\ver,3=\test,4=\desc,5=\hl,6=\justi,7=\type}
             {\requirement{\StrBehind{\refe}{#1}}{\ver}{\test}{\desc}{\hl}{\justi}}    
}}

Au départ, je pensais qu’il suffirait de sauveagerder le compteur de lignes pour le remettre après, mais ça ne fonctionne pas. Il semble que tout soit redéfini et que la commande de usecaseCsv ne soit exécutée que sur la premère ligne du fichier 1 (et donc une première fois sur toutes du fichier 2).

Auriez-vous une idée de coment faire pour contourner ce problème?

Merci pour votre aide!

Édité par charlie02

+0 -0

Salut,

Quel est le but du code, peux-tu donner un exemple d’entrée et la mise en page (peut-être même sous forme de code LaTeX) que tu dois obtenir ?

PS : ce serait peut-être plus simple (en fonction de ce sur quoi tu es à l’aise) de regarder du côté de LuaLaTeX voire même d’écrire un script dans le langage de ton choix qui parcourt le CSV et te fournit le code LaTeX).

Assez des salamis, je passe au jambon — Je fais un carnage si ce car nage car je nage, moi, Karnaj ! — Le comble pour un professeur de mathématique ? Mourir dans l’exercice de ses fonctions.

+1 -0
Auteur du sujet

Salut,

Le but du code est de mettre en page de manière lisible une liste de cas d’utilisations associés à une liste d’exigeances. Par exemple, avec comme première ligne de fichier 1:

EGM-UC-01|1|Design a project|Critical|Critical|Design a project & all the documentation necessary for its developement|Client; Designer; Architect|

et comme fichier 2:

EGM-REQ-001|1|D|The method should be agile|||
EGM.PRE-UC-01.M110|1|I|The technical documentation is read and understood|EGM.PRE-UC-01||MainFlow
EGM.PRE-UC-02.M110|1|T|The naming convention is defined|EGM.PRE-UC-02||MainFlow
EGM.SRY-UC-01.001|1|D|The client must be present|EGM.SRY-UC-01||Precondition
EGM.SRY-UC-01.002|1|A|The client must satisfied by the Story Book|EGM.SRY-UC-01||Postcondition
EGM.SRY-UC-01.M110|1|T|The requirements present in the documentation are translate and divide into Stories|EGM.SRY-UC-01||MainFlow
EGM.SRY-UC-01.M120|1|D|The Story Book is review by the client|EGM.SRY-UC-01||MainFlow
EGM.SRY-UC-01.M130|1|I|The client send their approuval on the current version of the Story Book|EGM.SRY-UC-01||MainFlow
EGM.SRY-UC-01.A110|1|D|The client express their thought on the current version of the Story Book|EGM.SRY-UC-01||AlternativeFlow
EGM.SRY-UC-01.A120|1|D|A new version of the Story Book is write with the client's observation |EGM.SRY-UC-01||AlternativeFlow
EGM.SRY-UC-02.001|1|I|There shouldn't be orphan requirements.|EGM.SRY-UC-02||Postcondition
EGM.SRY-UC-02.M110|1|D|The stories are associate to the requirements.|EGM.SRY-UC-02||MainFlow
EGM.SRY-UC-02.A110|1|A|The orphan requirement are rewrite to fit in a story.|EGM.SRY-UC-02||AlternativeFlow
EGM.SRY-UC-02.A120|1|A|Stories are rewrite to include the orphan requirement.|EGM.SRY-UC-02||AlternativeFlow
EGM.SRY-UC-02.A130|1|I|The orphan requirement are delete because no relevance.|EGM.SRY-UC-02||AlternativeFlow
EGM.USC-UC-01.001|1|I|Every Story must be link to a high-level Use-Case.|EGM.USC-UC-01||Postcondition
EGM.USC-UC-01.M110|1|A|Use-Case are created according to the Story Book (A Use-Case can cover multiple Stories but one Story is link to one Use-Case)|EGM.USC-UC-01||MainFlow
EGM.ATU-UC-01.001|1|I|Every part of the project must be cover by the P.B.S..|EGM.ATU-UC-01||Postcondition
EGM.ATU-UC-01.M110|1|A|The project is divide into componant.|EGM.ATU-UC-01||MainFlow
EGM.ATU-UC-01.M120|1|D|The componant are name and discribe into the P.B.S..|EGM.ATU-UC-01||MainFlow
EGM.ATU-UC-02.001|1|I|There shouldn't be orphan requirements/Use-Case.|EGM.ATU-UC-02||Postcondition
EGM.ATU-UC-02.M110|1|D|The requirement, Use-Case and componant are associated.|EGM.ATU-UC-02||MainFlow
EGM.ATU-UC-02.A110|1|A|The componant are redefine to include orphan requirements/Use-Case.|EGM.ATU-UC-02||AlternativeFlow
EGM.ATU-UC-03.M110|1|D|The P.B.S.?is change to include the previous reflexion|EGM.ATU-UC-03||MainFlow
EGM.USC-UC-02.001|1|I|Every low-level Use-Case must be link to a high-level Use-Case.|EGM.USC-UC-01||Postcondition
EGM.USC-UC-02.M110|1|A|Low-level Use-Case are created according to the high-level Use-Case and the Story Book (A high-level Use-Case can cover multiple low-level Use-Case but one low-level Use-Case is link to one high-level Use-Case)|EGM.USC-UC-01||MainFlow
EGM.ATU-UC-04.M110|1|I|The interfaces are identified|EGM.ATU-UC-04||MainFlow
EGM.USC-UC-03.M110|1|I|The software requirements are written|EGM.USC-UC-03||MainFlow
EGM.ATU-UC-05.M110|1|A|The internals I.C.D. are written|EGM.ATU-UC-05||MainFlow

On obtient (pour le priority critical, normalement il est aligné à droite, mais je n’ai pas trouvé comment le faire dans la mesure où le début de la ligne est à gauche):

EGM-UC-01 V1 Design a project
Complexity: Critical Priority:Critical

GlobalDescription:Design a project & all the documentation necessary forits developement

Actor:{Client;Designer;Architect}

Precondition:

.001_1/D The client must be present {EGM.SRY-UC-01}

Main Flow:

.M110_1/I The technical documentation is read and understood {EGM.PRE-UC-01}
.M110_1/T The requirements present in the documentation are translate and divide into Stories {EGM.SRY-UC-01}
.M120_1/D The Story Book is review by the client {EGM.SRY-UC-01}
.M130_1/I The client send their approuval on the current version of the Story Book {EGM.SRY-UC-01}
.M110_1/A Use-Case are created according to the Story Book (A Use-Case can covermultiple Stories but one Story is link to one Use-Case) {EGM.USC-UC-01}
.M110_1/A The project is divide into componant. {EGM.ATU-UC-01}
.M120_1/D The componant are name and discribe into the P.B.S.. {EGM.ATU-UC-01}
.M110_1/A Low-level Use-Case are created according to the high-level Use-Case andthe Story Book (A high-level Use-Case can cover multiple low-level Use-Casebut one low-level Use-Case is link to one high-level Use-Case) {EGM.USC-UC-01}

Alternative Flow:

.A110_1/D The client express their thought on the current version of the StoryBook {EGM.SRY-UC-01}
.A120_1/D A new version of the Story Book is write with the client’s observa-tion {EGM.SRY-UC-01}

Postcondition:

.002_1/A The client must satisfied by the Story Book {EGM.SRY-UC-01}
.001_1/I Every Story must be link to a high-level Use-Case. {EGM.USC-UC-01}
.001_1/I Every part of the project must be cover by the P.B.S.. {EGM.ATU-UC-01}
.001_1/I Every low-level Use-Case must be link to a high-level Use-Case. {EGM.USC-UC-01}

Pour ce qui est de ta proposition, je me fais le relais d’une amie que j’ai tentée d’aider et je lui avais déjà proposé de passer par un script qui générerais soit du latex soit un csv qui regroupe les infos dont elle a besoin à partir des deux de départ. Mais a parament ça n’est pas possible. Pour ce qui est du LuaLaTex, je ne sais pas mais il reste peu de temps à son stage et je doute qu’il soit possible de l’apprendre assez vite (entre autre parcequ’on n’y connait rien au lua…). Par contre, si tu pense que ça peut s’apprendre plus rapidement que le temps que nécéssiterait la résolution de ce problème en LaTex, pourquoi pas.

Au départ, je me demandais si il était possible d’utiliser une autre commande ou suite de commandes pour remplacer csvreader dans la commande useCaseCsv, ou bien si il était possible de "sauvegarder" entièrement l’état du premier appel pour le rétablir après (d’ailleur, j’ai regardé dans le code du paquet pour ça et le niveau requis est bien supperieur au mien…), mais je n’ai rien trouvé…

Quoi qu’il en soit, merci pour ton aide!

Édité par charlie02

+0 -0

Salut,

Je ne l’ai pas trouvé dans la doc du paquet, mais peut-être qu’en effet l’utilisation imbriquée de \csvreader n’est pas supportée. Ce ne serait pas étonnant vu comment ces commandes reposent en général sur un état modifiable global.

Si c’est le cas, je n’ai aucune idée de comment remédier à ton problème, j’ai jamais programmé en TeX ^^'

Auteur du sujet

Ce qui est sûr c’est que la commande que l’on donne à csvreader est réécrite, mais je n’ai pas réussi à la remettre correctement. Le compteur de,lignes l’est aussi, mais là je sais comment le remettre.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte