Lorsque le contenu d’un tableau existe déjà sous forme de données externes, par exemple dans un fichier .csv, il est inutile de ressaisir chaque cellule à la main. LaTeX dispose de plusieurs packages qui lisent un CSV et le transforment en tableau, ce qui évite de réécrire la source quand les données changent. Cette page en présente trois, avec leurs usages : csvsimple pour aller vite, pgfplotstable pour une mise en forme poussée, et datatool pour une approche de type base de données. Elle se termine par la colonne S de siunitx, qui sert à aligner les nombres sur le séparateur décimal (la colonne S est expliquée en détail dans la page « Unités (siunitx) »).
Pourquoi produire des tableaux à partir de données
Les résultats expérimentaux et les tableaux de synthèse sortent presque toujours d’un tableur ou d’un instrument sous forme de CSV (valeurs séparées par des virgules). Les recopier à la main dans des cellules tabular est fastidieux et source d’erreurs : chaque ligne ajoutée, chaque chiffre modifié oblige à retoucher le manuscrit.
On peut inverser la logique : laisser les données dans un fichier et demander seulement à LaTeX de les lire et de les composer. Il suffit alors de mettre les données à jour puis de recompiler pour que le tableau suive. Avec un seul CSV source, les mêmes nombres peuvent être réutilisés dans le corps du texte, les diapositives ou une annexe, sans erreur de recopie. Cette séparation des données et de la présentation prolonge naturellement l’habitude de LaTeX de séparer structure logique et apparence.
Les exemples de cette page utilisent le petit fichier CSV ci-dessous. Sa première ligne est une ligne d’en-tête qui nomme les colonnes product, price et weight ; les lignes suivantes contiennent les données.
product,price,weight
Apple,380,182.5
Orange,120,95.0
Melon,1280,1450.2Lecture rapide — csvsimple
csvsimple est un package léger qui lit un CSV pour produire des tableaux ou des boucles. On le charge avec \usepackage{csvsimple} (la version actuelle choisit en interne l’implémentation LaTeX3 csvsimple-l3). Le point d’entrée le plus rapide est \csvautotabular{data.csv} : donnez seulement le nom du fichier, et tout le CSV est versé automatiquement dans un tabular, avec la première ligne comme en-tête et des filets. C’est idéal pour obtenir rapidement un aperçu du contenu.
\csvautotabular{data.csv}Cette seule ligne produit un tableau de trois colonnes et trois lignes, avec product, price et weight comme en-têtes. C’est pratique, mais la mise en forme est limitée. Pour choisir vous-même l’alignement, les filets et les colonnes à conserver, utilisez \csvreader : c’est le véritable outil de travail de csvsimple.
\csvreader prend trois arguments sous la forme \csvreader[options]{data.csv}{assignments}{body}. Le deuxième argument est le fichier à lire, le troisième associe des noms de colonnes à des macros, et le quatrième indique quoi produire pour chaque ligne. Par exemple, price=\price rend la valeur de la colonne price disponible sous le nom \price dans le corps. Le cadre du tableau se règle avec des options comme tabular= et table head= (ligne d’en-tête).
\csvreader[
tabular = l r r,
table head = \hline Product & Price & Weight \\ \hline,
late after line = \\]
{data.csv}
{product=\product, price=\price, weight=\weight}
{\product & \price & \weight}Ici, tabular = l r r déclare trois colonnes (« gauche, droite, droite »), table head place la ligne d’en-tête et le filet supérieur, et le corps {\product & \price & \weight} développe chaque ligne de données en cellules. late after line = \\ demande à csvsimple d’ajouter un terminateur de ligne \\ après chaque ligne : c’est l’idiome qui met un saut seulement entre les lignes, sans en laisser un de trop après la dernière. Si les noms d’en-tête contiennent des espaces ou des symboles, on peut aussi désigner les colonnes par numéro dans le troisième argument : \csvcoli, \csvcolii, \csvcoliii, … représentent le contenu des première, deuxième, troisième colonnes.
Par défaut, la première ligne est traitée comme un en-tête et exclue des données. Pour lire un CSV sans ligne d’en-tête, la forme étoilée \csvreader* lit aussi la première ligne comme donnée. csvsimple propose également filter pour sélectionner des lignes selon une condition, ainsi que \csvstyle / \csvnames pour réutiliser un ensemble d’affectations : des mécanismes utiles au-delà des tableaux, pour tout traitement ligne par ligne.
Lecture et mise en forme — pgfplotstable
Lorsque l’on veut contrôler précisément l’apparence des nombres, pgfplotstable est le choix le plus puissant. Il fait partie de pgfplots et se charge avec \usepackage{pgfplotstable}. Sa commande centrale est unique : \pgfplotstabletypeset[options]{data.csv}. Elle lit le CSV, met les valeurs au format demandé avec la précision voulue, puis assemble en interne un tabular pour produire le résultat. Pour lire un CSV, on déclare le séparateur avec col sep=comma.
Tout se contrôle avec des options clé-valeur. Les principales sont listées ici.
| Option | Rôle | |
|---|---|---|
col sep=comma | col sep=comma | Lire comme CSV (séparé par des virgules) ; par défaut, séparation par espaces |
header | header=has colnames / header=false | Traiter la ligne 1 comme noms de colonnes / comme sans en-tête |
columns | columns={a,b,...} | Choisir les colonnes à sortir et leur ordre |
columns/NAME/.style | columns/price/.style={...} | Appliquer une mise en forme à une colonne nommée |
column name | column name=Titre | Remplacer l’en-tête imprimé de cette colonne |
fixed | fixed, fixed zerofill, precision=n | Notation fixe, zéros de remplissage, n décimales |
sci | sci, sci zerofill | Composer en notation scientifique (exponentielle) |
string type | string type | Colonne de texte (aucun formatage numérique) |
dec sep align | dec sep align | Aligner la colonne sur le séparateur décimal (nécessite array) |
\pgfplotstabletypeset[
col sep = comma,
header = has colnames,
columns = {product, price, weight},
columns/product/.style = {string type, column name = Product},
columns/price/.style = {column name = Price, fixed, precision = 0},
columns/weight/.style = {column name = Weight (g), fixed, fixed zerofill,
precision = 1, dec sep align},
]{data.csv}Dans cet exemple, la colonne product est traitée comme string type (texte), price comme un entier (precision=0), et weight avec une décimale et des zéros finaux, alignée sur le séparateur décimal par dec sep align. Les en-têtes sont remplacés avec column name. Les mêmes données changent de nombre de chiffres en modifiant seulement precision : contrôler l’apparence des nombres indépendamment du CSV est précisément le point fort de pgfplotstable.
pgfplotstable peut aussi créer des colonnes calculées à partir des colonnes lues : on peut définir avec create on use une colonne « calculée à l’utilisation », ou post-traiter les valeurs dans columns/.../.style avec postproc cell content. Des opérations proches d’un tableur se font ainsi entièrement dans LaTeX. Les filets se règlent avec every head row/.style ou l’intégration booktabs (un réglage qui insère automatiquement \toprule / \midrule / \bottomrule). Cette puissance alourdit la syntaxe ; une bonne règle est donc pgfplotstable pour les tableaux numériques élaborés, csvsimple pour un simple CSV → tableau.
Comme base de données — datatool
Le troisième package, datatool, lit un CSV comme une base de données et excelle dans le traitement ligne par ligne, de type publipostage. On le charge avec \usepackage{datatool}, puis \DTLloaddb{name}{data.csv} importe le CSV dans une base nommée. Par défaut, la première ligne est l’en-tête et ses noms de colonnes deviennent les clés de chaque valeur. Pour un CSV sans en-tête, \DTLloaddb[noheader]{...}{...} nomme automatiquement les colonnes Column1, Column2, ….
Une fois les données chargées, \DTLforeach{name}{assignments}{body} parcourt les lignes une à une. Les affectations s’écrivent « macro = nom de colonne », comme dans \DTLforeach{db}{\Product=product,\Price=price}{…} ; dans le corps, \Product et \Price se développent en valeurs de la ligne courante. Pour faire un tableau, exécutez \DTLforeach dans un tabular et terminez le corps par le terminateur de ligne \\.
\DTLloaddb{goods}{data.csv}
\begin{tabular}{l r}
\hline
Product & Price \\
\hline
\DTLforeach{goods}{\Product=product, \Price=price}{%
\Product & \Price \\}
\hline
\end{tabular}Ici, le CSV est chargé sous le nom goods, et dans le tabular, \DTLforeach émet « produit & prix » pour chaque ligne. La vraie force de datatool est moins la composition de tableaux que la manipulation des données : calculer sommes et moyennes, trier, exclure des lignes selon une condition au moyen de macros, ou encore générer des bibliographies et des documents fusionnés. À l’inverse, si vous voulez seulement convertir un CSV en tableau, csvsimple est plus concis.
Aligner les nombres sur le décimal — la colonne S de siunitx
Que les données viennent ou non d’un CSV, une colonne de nombres pose le même problème : elle est difficile à lire si les chiffres ne s’alignent pas. Dans un tabular écrit à la main, la solution classique est la colonne S de siunitx. En écrivant S dans la spécification de colonne à la place de r ou autre, les nombres de cette colonne s’alignent sur le séparateur décimal. Elle est disponible après \usepackage{siunitx}.
\begin{tabular}{l S[table-format=4.1]}
\toprule
{Product} & {Weight / \unit{\gram}} \\
\midrule
Apple & 182.5 \\
Orange & 95.0 \\
Melon & 1450.2 \\
\bottomrule
\end{tabular}Ici, la deuxième colonne est S[table-format=4.1], soit « 4 chiffres entiers, 1 décimale », ce qui aligne 182.5, 95.0 et 1450.2 sur le séparateur décimal. Il y a deux points essentiels. D’abord, régler table-format=integer.decimal sur la plus grande valeur de la colonne. Ensuite, protéger tout texte, comme un en-tête de colonne, avec des accolades {…} ({Weight / \unit{\gram}}). Sans cette protection, siunitx tente de lire l’en-tête comme un nombre et l’alignement se casse.
L’usage complet de la colonne S — choix de table-format, protection du texte, forme macro \tablenum utilisable dans \multicolumn, gestion des valeurs avec exposant — est présenté dans la page « Unités (siunitx) ». Répartir les rôles, \qty pour les grandeurs dans le texte et la colonne S pour les nombres dans les tableaux, garde une notation numérique cohérente dans tout le document.
Lequel choisir
Le mieux est de choisir selon l’objectif. Voici un guide approximatif.
- CSV simple → tableau :
csvsimple.\csvautotabularpour un tableau immédiat ;\csvreaderpour contrôler alignement et filets. - Travailler les nombres, leurs formats ou des colonnes calculées :
pgfplotstable. Le plus puissant, mais avec une syntaxe plus lourde. - Manipulation de données comme objectif principal — sommes, tris, traitements conditionnels :
datatool. Utile aussi pour les documents fusionnés. - Seulement aligner une colonne de nombres sur le décimal : la colonne
Sdesiunitx. Elle s’insère directement dans untabularécrit à la main.
Quelle que soit la méthode, la base reste le même vocabulaire tabular : spécification de colonnes, &, \\ et filets. Maîtrisez d’abord les « bases de tabular », puis choisissez l’outil selon le volume de données et la mise en forme voulue.