Vous avez peut-être vu l'excellent article de Chopopope sur l'utilisation des flottants en LaTeX, et en particulier la partie sur la création de tableaux. Non ? Pour les retardataires, c'est par ici…
Vous vous êtes surement rendu compte que créer des tableaux peut être long et fastidieux. De plus, en bons bioinformaticiens, vos données tabulées sont écrites dans des fichiers Exc… CSV. Et vous trouvez un peu bête (pour ne pas dire plus) de devoir recopier votre fichier CSV dans LaTeX tout en formatant le tableau. Mais vous le faites quand même, car il faut bien insérer les données dans le rapport final.
Aujourd'hui, je vais donc vous libérer de ce fardeau et vous montrer comment intégrer vos fichiers CSV dans un document LaTeX et comment formater automatiquement ce fichier en tableau ! Nous verrons aussi comment intégrer des données issues d'un CSV ailleurs que dans un tableau.
Voici de quoi vous allez avoir besoin pour réussir l'intégration de fichiers CSV dans LaTeX :
- Du café (ben oui, on est bioinfo quand même, faut pas déconner…)
- Un (voir plusieurs) fichier(s) CSV
- Une installation de LaTeX
- Le package CSVSimple
Ce dernier package, CSVSimple, sera celui utilisé pour importer les données. S'il n'est pas présent par défaut dans votre installation LaTeX, vous pouvez le récupérer sur le CTAN. Et puisque vous aimez lire les docs (RTFM toussa toussa), celle du package est disponible en suivant ce lien.
Vous êtes prêts ? On y va !
Tableaux simples
Pour commencer on va faire un tableau très très simple. Imaginons que vous ayez un fichier marsupilami_by_country.csv qui contient un comptage du nombre de marsupilamis (il parait qu'il y a des fans…) observés dans différents pays en fonction de leur phénotype. Petit rappel de biologie, pour ceux qui n'ont pas bien suivi les cours de zoologie, chez les marsupilamis on peut observer trois phénotypes différents : noir, jaune et jaune tacheté de noir.
Notre fichier contient donc :
1 2 3 4 5 |
Pays,Noir,Jaune,Tacheté Palombie,1,1,3 Colombie,2,3,1 Mordor,0,0,0 France,0,0,1 |
(Si quelqu'un a une explication pour l'absence de marsupilami dans le Mordor, je suis preneur…)
Maintenant que vous vous êtes cassé la tête, minimum 4 ans de thèse, à obtenir ce fichier vous avez bien envie de l'ajouter dans votre manuscrit.
Alors oui, vous pourriez écrire le code LaTeX suivant :
1 2 3 4 5 6 7 |
\begin{tabular}[cccc] Pays& ;Noir& ;Jaune& ;Tacheté\\ Palombie& ;1& ;1& ;3\\ Colombie& ;2& ;3& ;1\\ Mordor& ;0& ;0& ;0\\ France& ;0& ;0& ;1\\ \end{tabular} |
Mais comme vous n'êtes pas premier de cordée, vous êtes un peu fainéant, et vous préféreriez avoir beaucoup moins de ligne à écrire. Vu que toutes vos données sont déjà dans un fichier, on va pouvoir créer ce tableau en très peu de lignes :
1 |
\csvautotabular{marsupilami_by_country.csv} |
Et c'est tout… Il vous faudra seulement importer le package CSVSimple grâce à
1 |
\usepackage{csvsimple} |
.
Pour créer le tableau dans le document, j'ai utilisé la commande
1 |
\csvautotabular |
, qui prend, ici, comme paramètre unique le nom du fichier CSV depuis lequel importer les données.
Et voici ce que vous obtenez.
C'est beau non ? Non ? Ah vous préférez le design des tableaux fait avec le package booktabs ? À la place de
1 |
\csvautotabular |
vous pouvez utiliser
1 |
\csvautobooktabular |
(attention il faut également importer le package booktabs).
Des tableaux plus complexes grâce à la commande csvreader
La commande
1 |
\csvautotabular |
est formidable lorsque vous voulez afficher un tableau tout simple, mais parfois on veut faire des trucs un peu plus complexes. Et pour ça, le package CSVSimple intègre la commande
1 |
\csvreader |
qui lit un fichier csv (mais vous l'auriez deviné, non ?).
La commande
1 |
\csvreader |
prend plusieurs paramètres. La doc nous dit de l'utiliser de la façon suivante :
1 |
\csvreader[⟨options⟩]{⟨file name⟩}{⟨assignments⟩}{⟨command list⟩} |
. Comme vous le voyez plusieurs arguments peuvent être passés à cette commande :
- Des options : on verra cela plus tard, mais c'est ce qui permettra notamment de formater un peu le tableau.
- File name : est-ce bien nécessaire d'expliquer ?
- Assignements : va permettre de récupérer les différentes colonnes dans des variables. Attention le fichier CSV doit nécessairement contenir une ligne d'en-tête !
- Command list : une liste de commande à exécuter pour chaque ligne du fichier csv. Parmi ces commandes, il y a l'affichage des colonnes. Cela permet notamment de les afficher dans un ordre différent de celui du fichier de départ.
Allez, testons. On va toujours afficher le fichier utilisé ci-dessus. Mais comme je suis un peu chiant, j'ai absolument envie d'avoir les marsupilamis tacheté sur la deuxième colonne alors que c'est la dernière colonne de mon fichier…
1 2 3 |
\csvreader{marsupilami_by_country.csv} {Pays=\pays, Noir=\noir, Jaune=\jaune, Tacheté=\tachete} {\pays & ; \tachete & ; \noir & ; \jaune} |
Explications de cette commande. Je commence par dire à csvreader d'utiliser le fichier marsupilami_by_country.csv. Ensuite viennent les assignments : la colonne dont l'entête est "Pays" est ajouté à la macro \pays, Noir dans \noir, Jaune dans \jaune et Tacheté dans \tachete. Enfin je demande d'afficher d'abord \pays puis \tachete puis \noir et enfin \jaune.
Résultat ?
1 |
Misplaced alignment tab character & ;. |
Mais pourquoi ? En fait c'est assez logique. À aucun moment on a dit à LaTeX de créer un tableau. Il voit donc une marque de tabulation, mais il n'est pas dans un environnement tableau. Et c'est là qu'interviennent les options ! Dans les options on va pouvoir dire à csvreader d'afficher le tout dans un environnement tabular en créant 4 colonnes centrées séparées par une ligne verticale :
1 2 3 |
\csvreader[tabular=|c|c|c|c|]{marsupilami_by_country.csv} {Pays=\pays, Noir=\noir, Jaune=\jaune, Tacheté=\tachete} {\pays & ; \tachete & ; \noir & ; \jaune} |
Tadaaa !
Une autre solution serait de déclarer un environnement tabular et de placer la commande
1 |
\csvreader |
à l'interieur.
Grâce aux options, il est également possible de faire des tableaux bien plus complexes. Par exemple, il est possible d'alterner les couleurs d'arrière-plan des lignes !
Reprenons le tableau précédent auquel on va ajouter une ligne d'en-tête qui aura un arrière-plan gris foncé alors que les autres lignes alterneront entre blanc et gris clair. Voilà le code :
1 2 3 4 5 6 7 |
\usepackage[table]{xcolor} \csvreader[head to column names, tabular=|c|c|c|c|, table head=\hline\rowcolor{gray !99}\color{white}Pays & ; \color{white}Tacheté & ; \color{blue}Noir & ; \color{yellow}Jaune, late after head=\\\hline\rowcolor{white}, late after line=\csvifoddrow{\\\rowcolor{white}}{\\\rowcolor{gray !25}}] {marsupilami_by_country.csv} {Pays=\pays, Noir=\noir, Jaune=\jaune, Tacheté=\tachete} {\pays & ; \tachete & ; \noir & ; \jaune} |
Ce code nécessite pas mal d'explication.
Déjà il nécessite l'import du package xcolor avec l'option table.
1 |
table head=\hline\rowcolor{gray !99}\color{white}Pays & ; \color{white}Tacheté & ; \color{blue}Noir & ; \color{yellow}Jaune |
: Ici j'ai défini la ligne d'en-tête du tableau et sa couleur.
1 |
late after head=\\hline\rowcolor{white} |
: Ici on définit la ligne qui suit celle d'en-tête. J'ai commencé par ajouter un retour à la ligne (
1 |
\ |
) que je n'avais pas mis dans la ligne d'en-tête, et j'ai défini l'arrière-plan de la ligne comme blanc.
1 |
late after line=\csvifoddrow{\\rowcolor{white}}{\\rowcolor{gray !25}}]  ; |
: Ici j'ai utilisé
1 |
\csvifoddrow |
pour définir la couleur d'arrière-plan des lignes impaires comme blanche et celle des lignes paires comme grises.
Voilà ce qu'on obtient :
Pour aller plus loin : le publipostage
Vous vous souvenez, la commande
1 |
\csvreader |
ne crée pas d'environnement tabular. Ce qui veut dire que la commande peut-être utilisée pour faire autre chose que des tableaux, comme par exemple des rapports automatiques ou du publipostage. Il suffit de remplacer les marques de tabulations par des phrases :
1 2 3 |
\csvreader{marsupilami_by_country.csv} {Pays=\pays, Noir=\noir, Jaune=\jaune, Tacheté=\tachete} {En \pays, il y a \tachete~Marsupilamis tachetés, \noir~Marsupilamis noirs et \jaune~Marsupilamis jaunes.} |
Ajoutez un
1 |
\clearpage |
à la fin de la commande d'affichage et vous obtiendrez une page par pays. Ajoutez ensuite des instructions pour faire une belle mise en page et vous pourrez faire des rapports automatiquement.
Imaginez maintenant qu'à la place du nombre de marsupilamis dans un pays donné, le fichier contienne la liste des participants à un congrès. Il devient très facile de créer leur badge et leur attestation de participation en quelques lignes. Mais je vous laisse tester par vous-même ;-).
Il y a plein d'autres fonctions super cool dans le package csvsimple notamment pour trier les données selon des critères plus ou moins complexes. Une fois que vous avez lu un fichier csv vous pouvez également utiliser plein d'autres fonction de LaTeX et notamment créer vos graphiques directement grâce à tikz. Plein d'exemples d'utilisation sont données dans la doc de csvsimple, n'hésitez pas à y jeter un coup d'œil et à nous montrer vos créations !
Pour finir, je vous donne le code minimal permettant de réaliser l'ensemble des tableaux que j'ai présentés dans l'article.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
\documentclass[a4paper,12pt]{article} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{csvsimple} %Il faut importer la package CSVSimple pour que ça fonctionne ! \usepackage{booktabs} \usepackage[table]{xcolor} \begin{document} \csvautotabular{marsupilami_by_country.csv} \csvautobooktabular{marsupilami_by_country.csv} \csvreader[head to column names, tabular=|c|c|c|c|, table head=\hline\rowcolor{gray !99}\color{white}Pays & ; \color{white}Tacheté & ; \color{blue}Noir & ; \color{yellow}Jaune, late after head=\\\hline\rowcolor{white}, late after line=\csvifoddrow{\\\rowcolor{white}}{\\\rowcolor{gray !25}}] {marsupilami_by_country.csv} {Pays=\pays, Noir=\noir, Jaune=\jaune, Tacheté=\tachete} {\pays & ; \tachete & ; \noir & ; \jaune} \csvreader{marsupilami_by_country.csv} {Pays=\pays, Noir=\noir, Jaune=\jaune, Tacheté=\tachete} {En \pays, il y a \tachete~Marsupilamis tachetés, \noir~Marsupilamis noirs et \jaune~Marsupilamis jaunes.} \end{document} |
Merci aux relecteurs Gwenaëlle, et Hedjour.
Laisser un commentaire