Une lettre d'amour au format TSV

Retour accueil


Guillaume Plique et Robin de Mourat ont récemment écrit un article en hommage au CSV (en anglais) disponible en html ou en markdown. Je les remercie d’avoir diversifié les formats. Un peu moins d’utiliser github.

J’aime bien le CSV mais je lui préfère le format TSV1. Afin d’expliquer pourquoi je vais reprendre leur article en le modifiant de façon à mettre en valeur les avantages du TSV. Une grosse partie des arguments sont tirés d’un article comparant CSV et TSV à priori écrit par Jon Degenhardt, ingénieur chez Ebay pour la doc des outils tsv-utils que j’utilise dans l’article sur la datascience en cli.

Une lettre d’amour au format TSV

Le format TSV est simple

Le TSV est, dans l’idée, aussi simple que le CSV. Cependant pas besoin de “quote values containing commas” puisque le délimiteur est une tabulation et que les données contiennent très très rarement des tabulations. Si elles en contiennent il faudra également quoter les champs mais dans la pratique ça arrive suffisamment rarement pour ne pas être un souci. Au delà du fait que cela rend l’écriture et la génération de fichiers TSV bien plus facile, leurs parsage en est tellement facilité qu’il est possible d’utiliser les coreutils2 pour les traiter. Pas besoin de logiciels spécifiques. D’ailleurs l’article d’origine précise au sujet de la simplicité du format CSV “Cela ne veut pas dire qu’il ne faut pas utiliser de parser dédié, vous allez nécessairement vous tromper·”

Le fait que le délimiteur soit une tabulation a un avantage supplémentaire aux virgules. La plupart des outils Unix délimitant des champs considérent par défaut les tabulations ou les blancs comme délimiteurs par défaut. Ainsi vous pourrez utiliser < data.tsv cut -f2 sans avoir à spécifier le délimiteur ou, s’il n’y a pas de blancs dans les données < data.tsv awk '{blabla}'. C’est un petit confort assez anecdotique au premier abord mais qui sur le long terme est agréable si vous traitez souvent des données.

Le TSV est une idée collective

Tout pareil que le CSV.

TSV est du texte

Tout pareil.

Un souci que l’on m’a déjà fait remonter est la difficulté de lire du TSV par un·e humain·e puisque, par défaut, les tabulations s’affichent comme une suite d’espace dans la plupart des éditeurs de texte. Dans la plupart des bons éditeurs de texte il est possible de modifier l’apparence des caractères invisibles. Par exemple, pour vim, vous pouvez ajouter dans votre .vimrc :

set invlist
" tab = 3 espaces et un pipe, espace insécable = carré, espace fin de ligne = rond
set listchars=tab:\ \ \|,nbsp:▪,trail:○

de façon à ce que

truc    machin  bidule
blabla  bonjour bip coucou

s’affiche comme

truc   |machin   |bidule
blabla   |bonjour bip   |coucou

Il est aussi possible de jouer avec vartabstop pour aligner les champs, de manière à ce que nos données s’affichent comme ceci :

truc     |machin        |bidule
blabla   |bonjour bip   |coucou

TSV est “streamable”

Tout pareil.

Anecdote : Au travail une personne souhaitait acheter un ordinateur très puissant pour plus de 3000€ avec l’espoir qu’il puisse correctement ouvrir et traiter des fichiers excel de plusieurs giga. Il avait déjà imaginé tout son traitement en consultant le contenu d’un fichier pdf descriptif. Lorsqu’il a vu le résultat de head data.csv dans un terminal il était extrêmement surpris. Il n’avait pas auparavant conçu que l’on puisse ne lire que le début d’un fichier texte sans tout charger en mémoire. Son expérience des tableurs et la manière dont ils gèrent les les fichiers csv ou tsv lui faisait penser que des fichiers de plusieurs giga nécessitaient forcément une grosse puissance. Évidemment le traitement de plusieurs giga de données restera long et pourra toujours être grandement accéléré par du meilleur matériel3 mais la quantité de mémoire vive est une variable assez peu importante.

TSV est succint

Pareil mais plus parce que l’on échappe rarement les champs avec des apostrophes.

TSV à l’envers c’est toujours du TSV

Pareil. Je n’avais jamais pensé à cela, c’est intéressant.

Excel déteste le TSV

Il est vrai qu’excel prend ses aises avec les CSV et les TSV. Il mettra parfois des virgules, parfois des points virgule, changera parfois l’encodage. Je ne sais pas si les auteurs de l’article prennent excel comme exemple de tous les tableurs mais je ne pense pas puisqu’il me semble que libreoffice calc respecte bien ces formats là.

Conclusion

Faire du CSV plutôt que du TSV n’est pas grave mais je pense que c’est préférable et que ça ne présente que des avantages. L’outillage nécessaire pour les traiter, surtout pour des traitements simples, sera plus basique, plus stable, moins spécifique. Les traitements seront plus rapides. Les fichiers un peu plus légers4. La lecture par des personnes est plus facile.

Si vous êtes convaincu·es par ces arguments et souhaitez convertir des fichiers CV existants en TSV je recommande le programme csv2tsv.


  1. Tab-Separated Values (TSV). Les champs sont séparés par des tabulations. 

  2. cat, ls, cp, sort, uniq, grep etc. https://fr.wikipedia.org/wiki/GNU_Core_Utilities (ou autre variantes non GNU) 

  3. quoi que cela dépend également de la complexité du traitement 

  4. j’ai testé sur un fichier csv de 1Go avec quelques apostrophes par ligne, j’obtiens une économie d’environ 6% donc bon, à moins que le stockage soit un élément déterminant c’est presque négligeable.