Le site arthur.bebou.netlib.re - retour accueil
git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |
index.sh (6294B)
1 #! page 2 title: Une lettre d\'amour au format TSV 3 author: Arthur Pons 4 description: Pourquoi les gens qui prétendent que le format TSV est mort ont tort 5 publication: 2024-04-25 6 7 sectionmd: main 8 9 [Guillaume Plique](https://medialab.sciencespo.fr/en/people/guillaume-plique) 10 et [Robin de Mourat](https://medialab.sciencespo.fr/en/people/robin-de-mourat) 11 ont récemment écrit un article en hommage au CSV (en anglais) disponible en 12 [html](https://medialab.sciencespo.fr/en/news/a-love-letter-to-the-csv-format/) 13 ou en 14 [markdown](https://raw.githubusercontent.com/medialab/xan/prod/docs/LOVE_LETTER.md). 15 Je les remercie d'avoir diversifié les formats. Un peu moins d'utiliser github. 16 17 J'aime bien le CSV mais je lui préfère le format TSV[^1]. Afin d'expliquer pourquoi 18 je vais reprendre leur article en le modifiant de façon à mettre en valeur les 19 avantages du TSV. Une grosse partie des arguments sont tirés d'un [article 20 comparant CSV et 21 TSV](https://raw.githubusercontent.com/eBay/tsv-utils/master/docs/comparing-tsv-and-csv.md) 22 à priori écrit par [Jon Degenhardt](https://github.com/jondegenhardt), 23 ingénieur chez Ebay pour la doc des outils 24 [tsv-utils](https://github.com/eBay/tsv-utils) que j'utilise dans l'article sur 25 la [datascience en cli](/datascience-cli/index.html). 26 27 # Une lettre d'amour au format TSV 28 29 ## Le format TSV est simple 30 31 Le TSV est, dans l'idée, aussi simple que le CSV. Cependant pas besoin de 32 "quote values containing commas" puisque le délimiteur est une tabulation et 33 que les données contiennent très très rarement des tabulations. Si elles en 34 contiennent il faudra également quoter les champs mais dans la pratique ça 35 arrive suffisamment rarement pour ne pas être un souci. Au delà du fait que 36 cela rend l'écriture et la génération de fichiers TSV bien plus facile, leurs 37 parsage en est tellement facilité qu'il est possible d'utiliser les 38 coreutils[^2] pour les traiter. Pas besoin de logiciels spécifiques. D'ailleurs 39 l'article d'origine précise au sujet de la simplicité du format CSV "Cela ne 40 veut pas dire qu'il ne faut pas utiliser de parser dédié, vous allez 41 ***nécessairement*** vous tromper·" 42 43 Le fait que le délimiteur soit une tabulation a un avantage supplémentaire aux 44 virgules. La plupart des outils Unix délimitant des champs considérent par défaut 45 les tabulations ou les blancs comme délimiteurs par défaut. Ainsi vous pourrez 46 utiliser `< data.tsv cut -f2` sans avoir à spécifier le délimiteur ou, s'il n'y 47 a pas de blancs dans les données `< data.tsv awk '{blabla}'`. C'est un petit 48 confort assez anecdotique au premier abord mais qui sur le long terme est 49 agréable si vous traitez souvent des données. 50 51 ## Le TSV est une idée collective 52 53 Tout pareil que le CSV. 54 55 ## TSV est du texte 56 57 Tout pareil. 58 59 Un souci que l'on m'a déjà fait remonter est la difficulté de 60 lire du TSV par un·e humain·e puisque, par défaut, les tabulations s'affichent 61 comme une suite d'espace dans la plupart des éditeurs de texte. Dans la plupart 62 des bons éditeurs de texte il est possible de modifier l'apparence des caractères 63 invisibles. Par exemple, pour vim, vous pouvez ajouter dans votre `.vimrc` : 64 65 set invlist 66 " tab = 3 espaces et un pipe, espace insécable = carré, espace fin de ligne = rond 67 set listchars=tab:\ \ \|,nbsp:▪,trail:○ 68 69 de façon à ce que 70 71 truc machin bidule 72 blabla bonjour bip coucou 73 74 s'affiche comme 75 76 truc |machin |bidule 77 blabla |bonjour bip |coucou 78 79 Il est aussi possible de jouer avec `vartabstop` pour aligner les champs, de 80 manière à ce que nos données s'affichent comme ceci : 81 82 truc |machin |bidule 83 blabla |bonjour bip |coucou 84 85 ## TSV est "streamable" 86 87 Tout pareil. 88 89 Anecdote : Au travail une personne souhaitait acheter un ordinateur très 90 puissant pour plus de 3000€ avec l'espoir qu'il puisse correctement ouvrir et 91 traiter des fichiers excel de plusieurs giga. Il avait déjà imaginé tout son 92 traitement en consultant le contenu d'un fichier pdf descriptif. Lorsqu'il a vu 93 le résultat de `head data.csv` dans un terminal il était extrêmement surpris. 94 Il n'avait pas auparavant conçu que l'on puisse ne lire que le début d'un 95 fichier texte sans tout charger en mémoire. Son expérience des tableurs et la 96 manière dont ils gèrent les les fichiers csv ou tsv lui faisait penser que des 97 fichiers de plusieurs giga nécessitaient forcément une grosse puissance. 98 Évidemment le traitement de plusieurs giga de données restera long et pourra 99 toujours être grandement accéléré par du meilleur matériel[^3] mais la quantité 100 de mémoire vive est une variable assez peu importante. 101 102 ## TSV est succint 103 104 Pareil mais plus parce que l'on échappe rarement les champs avec des 105 apostrophes. 106 107 ## TSV à l'envers c'est toujours du TSV 108 109 Pareil. Je n'avais jamais pensé à cela, c'est intéressant. 110 111 ## Excel déteste le TSV 112 113 Il est vrai qu'excel prend ses aises avec les CSV et les TSV. Il mettra parfois 114 des virgules, parfois des points virgule, changera parfois l'encodage. Je ne sais 115 pas si les auteurs de l'article prennent excel comme exemple de tous les tableurs 116 mais je ne pense pas puisqu'il me semble que libreoffice calc respecte bien ces 117 formats là. 118 119 ## Conclusion 120 121 Faire du CSV plutôt que du TSV n'est pas grave mais je pense que c'est 122 préférable et que ça ne présente que des avantages. L'outillage nécessaire pour 123 les traiter, surtout pour des traitements simples, sera plus basique, plus 124 stable, moins spécifique. Les traitements seront plus rapides. Les fichiers un 125 peu plus légers[^4]. La lecture par des personnes est plus facile. 126 127 Si vous êtes convaincu·es par ces arguments et souhaitez convertir des fichiers 128 CV existants en TSV je recommande le programme 129 [csv2tsv](https://github.com/eBay/tsv-utils?tab=readme-ov-file#csv2tsv). 130 131 132 133 134 [^1]: Tab-Separated Values (TSV). Les champs sont séparés par des tabulations. 135 [^2]: cat, ls, cp, sort, uniq, grep etc. https://fr.wikipedia.org/wiki/GNU_Core_Utilities (ou autre variantes non GNU) 136 [^3]: quoi que cela dépend également de la complexité du traitement 137 [^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.