LaTeX : automatisez le traitement des CSV

Vous avez peut-être vu l'excellent article de Cho­po­pope sur l'utilisation des flot­tants en LaTeX, et en par­ti­cu­lier la par­tie sur la créa­tion de tableaux. Non ? Pour les retar­da­taires, c'est par ici

Vous vous êtes sur­ement ren­du compte que créer des tableaux peut être long et fas­ti­dieux. De plus, en bons bio­in­for­ma­ti­ciens, vos don­nées tabu­lées sont écrites dans des fichiers Exc… CSV. Et vous trou­vez un peu bête (pour ne pas dire plus) de devoir reco­pier votre fichier CSV dans LaTeX tout en for­ma­tant le tableau. Mais vous le faites quand même, car il faut bien insé­rer les don­nées dans le rap­port final.

Aujourd'hui, je vais donc vous libé­rer de ce far­deau et vous mon­trer com­ment inté­grer vos fichiers CSV dans un docu­ment LaTeX et com­ment for­ma­ter auto­ma­ti­que­ment ce fichier en tableau ! Nous ver­rons aus­si com­ment inté­grer des don­nées issues d'un CSV ailleurs que dans un tableau.

Voi­ci de quoi vous allez avoir besoin pour réus­sir l'intégration de fichiers CSV dans LaTeX :

  • Du café (ben oui, on est bioin­fo quand même, faut pas décon­ner…)
  • Un (voir plu­sieurs) fichier(s) CSV
  • Une ins­tal­la­tion de LaTeX
  • Le package CSV­Simple

Ce der­nier package, CSV­Simple, sera celui uti­li­sé pour impor­ter les don­nées. S'il n'est pas pré­sent par défaut dans votre ins­tal­la­tion LaTeX, vous pou­vez le récu­pé­rer sur le CTAN. Et puisque vous aimez lire les docs (RTFM tous­sa tous­sa), celle du package est dis­po­nible en sui­vant ce lien.

Vous êtes prêts ? On y va !

Tableaux simples

Pour com­men­cer on va faire un tableau très très simple. Ima­gi­nons que vous ayez un fichier marsupilami_by_country.csv qui contient un comp­tage du nombre de mar­su­pi­la­mis (il parait qu'il y a des fans…) obser­vés dans dif­fé­rents pays en fonc­tion de leur phé­no­type. Petit rap­pel de bio­lo­gie, pour ceux qui n'ont pas bien sui­vi les cours de zoo­lo­gie, chez les mar­su­pi­la­mis on peut obser­ver trois phé­no­types dif­fé­rents : noir, jaune et jaune tache­té de noir.

Notre fichier contient donc :

(Si quelqu'un a une expli­ca­tion pour l'absence de mar­su­pi­la­mi dans le Mor­dor, je suis pre­neur…)

Main­te­nant que vous vous êtes cas­sé la tête, mini­mum 4 ans de thèse, à obte­nir ce fichier vous avez bien envie de l'ajouter dans votre manus­crit.

Alors oui, vous pour­riez écrire le code LaTeX sui­vant :

Mais comme vous n'êtes pas pre­mier de cor­dée, vous êtes un peu fai­néant, et vous pré­fé­re­riez avoir beau­coup moins de ligne à écrire. Vu que toutes vos don­nées sont déjà dans un fichier, on va pou­voir créer ce tableau en très peu de lignes :

Et c'est tout…  Il vous fau­dra seule­ment impor­ter le package CSV­Simple grâce à  

\use­pa­ckage{csv­simple}

 .

Pour créer le tableau dans le docu­ment, j'ai uti­li­sé la com­mande

\csvau­to­ta­bu­lar

 , qui prend, ici, comme para­mètre unique le nom du fichier CSV depuis lequel impor­ter les don­nées.

Et voi­ci ce que vous obte­nez.

 

C'est beau non ? Non ? Ah vous pré­fé­rez le desi­gn des tableaux fait avec le package book­tabs ? À la place de

\csvau­to­ta­bu­lar

  vous pou­vez uti­li­ser

\csvau­to­book­ta­bu­lar

 (atten­tion il faut éga­le­ment impor­ter le package book­tabs).

 

Des tableaux plus complexes grâce à la commande csvreader

La com­mande

\csvau­to­ta­bu­lar

  est for­mi­dable lorsque vous vou­lez affi­cher un tableau tout simple, mais par­fois on veut faire des trucs un peu plus com­plexes. Et pour ça, le package CSV­Simple intègre la com­mande

\csvrea­der

  qui lit un fichier csv (mais vous l'auriez devi­né, non ?).

La com­mande

\csvrea­der

  prend plu­sieurs para­mètres. La doc nous dit de l'utiliser de la façon sui­vante :

\csvrea­der[⟨options⟩]{⟨file name⟩}{⟨assi­gn­ments⟩}{⟨com­mand list⟩}

 . Comme vous le voyez plu­sieurs argu­ments peuvent être pas­sés à cette com­mande :

  • Des options : on ver­ra cela plus tard, mais c'est ce qui per­met­tra notam­ment de for­ma­ter un peu le tableau.
  • File name : est-ce bien néces­saire d'expliquer ?
  • Assi­gne­ments : va per­mettre de récu­pé­rer les dif­fé­rentes colonnes dans des variables. Atten­tion le fichier CSV doit néces­sai­re­ment conte­nir une ligne d'en-tête !
  • Com­mand list : une liste de com­mande à exé­cu­ter pour chaque ligne du fichier csv. Par­mi ces com­mandes, il y a l'affichage des colonnes. Cela per­met  notam­ment de les affi­cher dans un ordre dif­fé­rent de celui du fichier de départ.

Allez, tes­tons. On va tou­jours affi­cher le fichier uti­li­sé ci-des­sus. Mais comme je suis un peu chiant, j'ai abso­lu­ment envie d'avoir les mar­su­pi­la­mis tache­té sur la deuxième colonne alors que c'est la der­nière colonne de mon fichier…

Expli­ca­tions de cette com­mande. Je com­mence par dire à csvrea­der d'utiliser le fichier marsupilami_by_country.csv. Ensuite viennent les assi­gn­ments : la colonne dont l'entête est "Pays" est ajou­té à la macro \pays, Noir dans \noir, Jaune dans \jaune et Tache­té dans \tachete. Enfin je demande d'afficher d'abord \pays puis \tachete puis \noir et enfin \jaune.

Résul­tat ?

Mais pour­quoi ? En fait c'est assez logique. À aucun moment on a dit à LaTeX de créer un tableau. Il voit donc une marque de tabu­la­tion, mais il n'est pas dans un envi­ron­ne­ment tableau. Et c'est là qu'interviennent les options ! Dans les options on va pou­voir dire à csvrea­der d'afficher le tout dans un envi­ron­ne­ment tabu­lar en créant 4 colonnes cen­trées sépa­rées par une ligne ver­ti­cale :

Tadaaa !

Une autre solu­tion serait de décla­rer un envi­ron­ne­ment tabu­lar et de pla­cer la com­mande

\csvrea­der

  à l'interieur.

Grâce aux options, il est éga­le­ment pos­sible de faire des tableaux bien plus com­plexes. Par exemple, il est pos­sible d'alterner les cou­leurs d'arrière-plan des lignes !

Repre­nons le tableau pré­cé­dent auquel on va ajou­ter une ligne d'en-tête qui aura un arrière-plan gris fon­cé alors que les autres lignes alter­ne­ront entre blanc et gris clair. Voi­là le code :

Ce code néces­site pas mal d'explication.

Déjà il néces­site l'import du package xco­lor avec l'option table.

table head=\hline\row­co­lor{gray !99}\color{white}Pays & \color{white}Tache­té & \color{blue}Noir & \color{yel­low}Jaune

  : Ici j'ai défi­ni la ligne d'en-tête du tableau et sa cou­leur.

late after head=\\hline\row­co­lor{white}

 : Ici on défi­nit la ligne qui suit celle d'en-tête. J'ai com­men­cé par ajou­ter un retour à la ligne (

\

 ) que je n'avais pas mis dans la ligne d'en-tête, et j'ai défi­ni l'arrière-plan de la ligne comme blanc.

late after line=\csvi­fod­drow{\\row­co­lor{white}}{\\row­co­lor{gray !25}}] 

 : Ici j'ai uti­li­sé

\csvi­fod­drow

  pour défi­nir la cou­leur d'arrière-plan des lignes impaires comme blanche et celle des lignes paires comme grises.

Voi­là ce qu'on obtient :

 

Pour aller plus loin : le publipostage

Vous vous sou­ve­nez, la com­mande

\csvrea­der

  ne crée pas d'environnement tabu­lar. Ce qui veut dire que la com­mande peut-être uti­li­sée pour faire autre chose que des tableaux, comme par exemple des rap­ports auto­ma­tiques ou du publi­pos­tage. Il suf­fit de rem­pla­cer les marques de tabu­la­tions par des phrases :

Ajou­tez un

\clear­page

  à la fin de la com­mande d'affichage et vous obtien­drez une page par pays. Ajou­tez ensuite des ins­truc­tions pour faire une belle mise en page et vous pour­rez faire des rap­ports auto­ma­ti­que­ment.

Ima­gi­nez main­te­nant qu'à la place du nombre de mar­su­pi­la­mis dans un pays don­né, le fichier contienne la liste des par­ti­ci­pants à un congrès. Il devient très facile de créer leur badge et leur attes­ta­tion de par­ti­ci­pa­tion en quelques lignes. Mais je vous laisse tes­ter par vous-même ;-).

Il y a plein d'autres fonc­tions super cool dans le package csv­simple notam­ment pour trier les don­nées selon des cri­tères plus ou moins com­plexes. Une fois que vous avez lu un fichier csv vous pou­vez éga­le­ment uti­li­ser plein d'autres fonc­tion de LaTeX et notam­ment créer vos gra­phiques direc­te­ment grâce à tikz. Plein d'exemples d'utilisation sont don­nées dans la doc de csv­simple, n'hésitez pas à y jeter un coup d'œil et à nous mon­trer vos créa­tions !

Pour finir, je vous donne le code mini­mal per­met­tant de réa­li­ser l'ensemble des tableaux que j'ai pré­sen­tés dans l'article.

 

Mer­ci aux relec­teurs Gwe­naëlle, et Hed­jour.



Pour continuer la lecture :


Commentaires

5 réponses à “LaTeX : automatisez le traitement des CSV”

  1. Super article ! On s'est tor­tu­ré sur l'import de résul­tats de BLAST en LaTeX, jusqu'à cet article. On l'a relayé dans tout le mas­ter bioin­fo de Bor­deaux 😉

    Salut à l'irc et mer­ci m4rsu.

  2. Avatar de Vincent Danjean
    Vincent Danjean

    Quand la base de don­née (le fichier csv) est petite et que les trai­te­ments sont un peu plus consé­quents (croi­se­ment de deux fichiers csv par exemple), j'utilise le paquet data­tool (com­mande \DTL­loaddb pour impor­ter les don­nées). C'est puis­sant, ça marche bien (mais ça prend du temps pro­ces­seur : ça reste limi­té à des tailles de don­nées rai­son­nables).

  3. Salut Pas moyen de mon côté d'importer un csv avec des accents espa­gnols. Tu sau­rais m'aider ? Mer­ci.

    1. Ne fau­drait-il pas ren­sei­gner la langue dans l'entête du fichier TeX ?
      \usepackage[spanish]{babel}

  4. Un article qui m'a énor­mé­ment aidé pour me lan­cer dans le publi­pos­tage.
    Un grand MERCI

Laisser un commentaire