Transposer un tableau dont les lignes auraient dû être des colonnes
Publié le 22/07/2026 · 13 min de lecture · Outils pour développeurs
Daniel Okonkwo — Développeur front-end et rédacteur Tech chez Allin
Performance web · Formats de fichiers
Vérifié à partir de 4 sources
Transposer échange lignes et colonnes : la cellule [l][c] devient la cellule [c][l], et rien d'autre ne change. La ligne d'en-tête devient la première colonne : Name,Q1,Q2,Q3 au-dessus de Alice,10,20,30 et Bob,5,6,7 revient en Name,Alice,Bob puis Q1,10,5 puis Q2,20,6 puis Q3,30,7 — quatre lignes, trois colonnes, et les étiquettes descendent désormais le long du bord gauche au lieu de courir en haut. Les lignes de longueurs inégales sont complétées, jamais tronquées : la sortie compte autant de lignes que la ligne d'entrée la plus large avait de cellules, et une ligne courte apporte des chaînes vides. Avec a,b,c au-dessus de 1,2 et 3,4,5,6 tu obtiens quatre lignes de sortie, la dernière étant ,,6 — une ligne sans nom qui porte la valeur dont l'en-tête n'avait pas tenu compte. Les guillemets sont refaits de zéro, donc une cellule contenant le délimiteur ou un saut de ligne revient correctement citée. Il n'y a aucune conversion de type : 007 reste 007, 1.0 reste 1.0, true reste true, car l'outil ne fait que déplacer du texte. Le délimiteur est détecté sur le premier enregistrement et la sortie emploie le même — un fichier à points-virgules se transpose en fichier à points-virgules. Deux points de vigilance. Une ligne vide dans l'entrée devient une colonne entièrement vide dans la sortie, une ligne vide étant une ligne à une cellule vide. Et transposer n'est pas pivoter : un tableau au format long avec une clé répétée revient avec des en-têtes de colonnes en double plutôt que remodelé, car faire pivoter un tableau ne regroupe rien.
Ce qu'il advient de la ligne d'en-tête, des lignes de longueurs inégales, des types — et la seule chose pour laquelle on confond régulièrement la transposition et qu'elle ne sait pas faire.
Ce qu'il advient de la ligne d'en-tête
Rien de particulier, et c'est justement ce qu'il faut comprendre avant d'utiliser le résultat. L'outil ignore que ta première ligne est un en-tête. Il lit une grille de cellules, réécrit la même grille avec les axes échangés, et s'arrête. Ainsi Name,Q1,Q2,Q3 au-dessus de Alice,10,20,30 et Bob,5,6,7 devient quatre lignes : Name,Alice,Bob puis Q1,10,5 puis Q2,20,6 puis Q3,30,7. Tes étiquettes de colonnes sont désormais la première cellule de chaque ligne, et tes étiquettes de lignes — Alice et Bob — sont désormais l'en-tête.
La toute première cellule du tableau, celle qui disait Name, se retrouve dans le coin de la sortie comme étiquette d'une ligne d'en-tête qui n'étiquette plus rien d'utile. C'est normal pour un tableau transposé, et c'est pourquoi la plupart des gens la renomment ensuite à la main — de Name vers Indicateur ou Période, selon ce qui descend désormais à gauche. L'essentiel, c'est que ce qui lira le fichier ensuite croit toujours que la première ligne est un en-tête, et cette première ligne est maintenant la liste de tes anciennes étiquettes de lignes. Si tu passes le résultat dans un convertisseur CSV vers JSON, tes clés seront Name, Alice et Bob.
Lignes irrégulières : il complète, et ne tronque jamais
Un export réel n'est pas toujours rectangulaire. Une ligne peut être courte parce qu'un champ final était vide et que l'écrivain s'est arrêté tôt ; une ligne peut être longue parce qu'un délimiteur non échappé a coupé un champ en deux. Les deux arrivent, et un transposeur doit décider de la hauteur de la sortie. Celui-ci prend la ligne la plus large : le nombre de lignes de sortie égale le nombre de cellules de la plus longue ligne d'entrée, et toute position qu'aucune ligne d'entrée n'a remplie devient une chaîne vide.
La démonstration est courte. Prends l'en-tête a,b,c au-dessus des deux lignes 1,2 et 3,4,5,6. La ligne la plus large a quatre cellules, la sortie a donc quatre lignes : a,1,3 puis b,2,4 puis c,,5 puis ,,6. Lis cette dernière ligne avec attention. Elle porte la valeur 6, une vraie donnée de l'entrée, et sa première cellule est vide parce que l'en-tête n'avait que trois noms. L'outil te dit quelque chose de vrai et d'utile — il y avait un quatrième champ sur une ligne et rien ne le nommait — et il t'le dit en laissant une ligne sans nom en bas plutôt qu'en effaçant la preuve. Tronquer aurait jeté précisément la cellule qui prouve que ton fichier a un problème de guillemets.
Un effet de bord en découle. Transposer deux fois un tableau irrégulier ne rend pas l'original : la première passe comble les trous, la seconde reconstruit donc un rectangle. a,b,c au-dessus de 1,2 et 3,4,5,6 revient en a,b,c, au-dessus de 1,2,, et 3,4,5,6 — mêmes valeurs, quatre colonnes partout, vides de fin là où l'original était court. Sur un tableau rectangulaire, la double transposition est exacte et rend le fichier de départ, octet pour octet, à condition que les guillemets aient déjà été minimaux.
Les types : l'outil ne fait rien, et c'est là que le risque se déplace
Il n'y a aucune conversion de type dans cet outil. Il analyse les cellules comme du texte, les déplace, et les réécrit comme du texte. 007 reste 007, 1.0 reste 1.0, true reste true, et une date reste la chaîne qu'elle était. Rien n'est arrondi, rien n'est réinterprété, et un zéro initial ne peut pas se perdre, puisqu'aucun nombre n'existe jamais.
Le risque est entièrement en aval, et c'est la transposition qui le crée. Avant, chaque colonne était homogène : une colonne de dates, une colonne de montants, une colonne de noms de régions. Après, chaque colonne est un mélange, puisqu'elle contient une cellule de chacune des colonnes d'origine. Ouvre le résultat dans un tableur et la détection de types s'exécute colonne par colonne sur des données qui n'ont plus de type par colonne. L'étiquette de la première cellule est du texte et le reste des nombres : une colonne de nombres est lue comme du texte, ou une cellule isolée qui ressemble à une date est convertie en date. Ce n'est pas le fait du transposeur, mais c'en est la conséquence, et c'est pourquoi le conseil pratique est de transposer dans un outil texte et d'ouvrir le résultat avec toutes les colonnes forcées en texte plutôt que de laisser un tableur deviner.
Où cela se présente, et la seule tâche qu'il ne peut pas faire
Trois situations représentent l'essentiel des cas. Une série temporelle exportée au format long, une ligne par période, alors que le graphique que tu construis veut une colonne par période. Un export d'enquête où les questions sont des lignes et les répondants des colonnes, ou l'inverse, selon l'outil qui l'a écrit. Et un rapport où quelqu'un a construit le tableau croisé à l'envers avant de l'envoyer : le fichier qui arrive dans ta boîte a les périodes sur le côté et les indicateurs en haut, quand tout le reste de ta chaîne attend le contraire. Dans les trois cas, le remède est une vraie transposition : les données sont déjà de la bonne forme, elles sont simplement tournées.
Il existe une quatrième situation qui ressemble trait pour trait à ces trois-là et n'en est pas une, et c'est celle qui coûte un après-midi. Un tableau au format long comporte une colonne clé qui se répète : Date, Région, Ventes, avec deux lignes pour janvier parce qu'il y a deux régions. Le transposer ne le remodèle pas. Donne à l'outil Date,Region,Sales au-dessus de 2026-01,North,120, 2026-01,South,90 et 2026-02,North,140, et la sortie tient en trois lignes : Date,2026-01,2026-01,2026-02 puis Region,North,South,North puis Sales,120,90,140. La première ligne comporte maintenant un en-tête en double, et le tableau est toujours long — une entrée par observation, simplement écrite en travers. Ce que tu voulais, c'est un pivot : grouper par date, étaler les régions en colonnes, et poser les ventes dans les cellules. C'est une agrégation, pas une rotation, et cela demande un outil qui sait quelle colonne est la clé, laquelle est l'étiquette et laquelle est la valeur.
Trois comportements discrets à connaître
Une ligne vide dans ton entrée devient une colonne vide dans la sortie. Ce n'est pas un bug et cela découle directement de la définition : une ligne vide est une ligne contenant une cellule vide, donc après rotation c'est une colonne contenant une cellule vide plus du remplissage. Donne à l'outil a,b puis 1,2 puis une ligne vide puis 3,4, et tu obtiens a,1,,3 au-dessus de b,2,,4 — la troisième colonne est la ligne vide. Comme on colle des données séparées par des lignes vides plus souvent qu'on ne le croit, c'est la surprise la plus fréquente que produit l'outil. Supprime les lignes vides avant de transposer si elles n'étaient pas voulues.
Le délimiteur ressort tel qu'il est entré. Il est détecté sur le premier enregistrement et réutilisé pour la sortie : un fichier à points-virgules se transpose en fichier à points-virgules, un fichier à tabulations en fichier à tabulations. Aucune option ne permet d'en changer au passage — si tu en veux un autre, passe ensuite le convertisseur de délimiteur. Corollaire : une détection erronée ruine le résultat au lieu de le dégrader. Force la virgule sur un fichier qui utilise vraiment des points-virgules et chaque ligne devient une cellule unique, donc tout le tableau se transpose en une seule ligne.
Les guillemets sont reconstruits, pas recopiés. Chaque cellule est réexaminée à la sortie et citée seulement si elle contient désormais le délimiteur, un guillemet ou un saut de ligne. Une cellule contenant y,z était citée à l'entrée et l'est de nouveau à la sortie ; une cellule citée sans raison ressort nue. Les cellules à saut de ligne intégré survivent intactes, toujours citées, s'étalant toujours sur deux lignes physiques du fichier. La sortie est donc un CSV valide même quand l'entrée était citée plus lourdement que nécessaire — et cela signifie aussi qu'une comparaison octet par octet d'une double transposition divergera si l'original portait des guillemets superflus.
| Entrée | Sortie | Ce que cela signifie |
|---|---|---|
| Name,Q1,Q2,Q3 / Alice,10,20,30 / Bob,5,6,7 | Name,Alice,Bob / Q1,10,5 / Q2,20,6 / Q3,30,7 | La ligne d'en-tête devient la première colonne ; les étiquettes de lignes deviennent l'en-tête |
| a,b,c / 1,2 / 3,4,5,6 | a,1,3 / b,2,4 / c,,5 / ,,6 | Il complète jusqu'à la ligne la plus large et ne tronque jamais ; la dernière ligne est sans nom car l'en-tête était court |
| a,b,c / 1,2,3 / x,"y,z",w | a,1,x / b,2,"y,z" / c,3,w | Les guillemets sont refaits de zéro : une cellule contenant le délimiteur est recitée à sa nouvelle place |
| a,b / 1,2 / (une ligne vide) / 3,4 | a,1,,3 / b,2,,4 | Une ligne vide est une ligne à une cellule vide : après rotation, c'est une colonne vide |
| Date,Region,Sales / 2026-01,North,120 / 2026-01,South,90 / 2026-02,North,140 | Date,2026-01,2026-01,2026-02 / Region,North,South,North / Sales,120,90,140 | Transposer n'est pas pivoter : la clé répétée produit un en-tête en double et le tableau reste long |
Questions fréquentes
- La première ligne est-elle traitée comme un en-tête ?
- Non, et aucune option ne permet de le dire. L'outil lit une grille et la fait pivoter ; toute ligne est une ligne. C'est le comportement souhaitable, car un transposeur qui traiterait la première ligne à part devrait décider quoi en faire — la garder en haut, ce qui ne serait pas une transposition, ou la déplacer en prétendant qu'elle reste un en-tête, ce qui serait un mensonge. En conséquence, après transposition tu voudras généralement renommer la toute première cellule à la main, car elle étiquette désormais une ligne d'en-tête faite de tes anciennes étiquettes de lignes, et non une colonne de quoi que ce soit.
- Quelle taille de fichier puis-je transposer ?
- La zone de dépôt accepte les fichiers jusqu'à 2 Mo, et tout s'exécute dans ton navigateur plutôt que sur un serveur : rien n'est envoyé. La vraie limite d'une transposition n'est pas la taille mais la forme : transposer transforme les lignes en colonnes, donc un fichier de 50 000 lignes devient un fichier de 50 000 colonnes. C'est du CSV valide et l'outil le produira, mais très peu de programmes l'ouvrent confortablement — les limites de colonnes des tableurs se comptent en dizaines de milliers, et un éditeur de texte te donnera une ligne de plusieurs mégaoctets de large. Si ta table est haute plutôt que large, demande-toi si tu veux vraiment une transposition, ou si ce qu'il te faut est un pivot qui regroupe les lignes en une poignée de colonnes.
- Pourquoi mon fichier transposé a-t-il une colonne entièrement vide ?
- C'est presque certainement parce que l'entrée comportait une ligne vide là où se trouve maintenant cette colonne. Une ligne vide s'analyse comme une ligne contenant une cellule vide, et après rotation cette ligne est une colonne. Compte depuis la gauche : la position de la colonne vide correspond à la position de la ligne vide comptée depuis le haut. La même chose se produit avec une ligne ne contenant que des délimiteurs, comme ,,, qui fait quatre cellules vides plutôt qu'une ligne vide mais donne le même résultat à l'œil. Retire d'abord les lignes vides de ton entrée — un saut de ligne final tout à la fin du fichier est géré et ne provoque pas cela, mais une ligne vide au milieu si.
- Puis-je ne transposer qu'une partie du fichier ?
- Pas en une étape : le transposeur prend toute l'entrée. La voie pratique consiste à découper d'abord et transposer ensuite. Colle seulement le bloc voulu, ou extrais les colonnes qui t'intéressent avec un extracteur de colonnes puis transpose le résultat — c'est souvent ce que tu voulais de toute façon : une table large transposée en entier est illisible, alors que quatre colonnes choisies transposées en quatre lignes forment un résumé qu'on peut coller dans un message. Si le fichier comporte plusieurs blocs séparés par des lignes vides, rappelle-toi que ces lignes vides deviennent des colonnes vides : sépare les blocs en entrées distinctes plutôt que de tout transposer ensemble.
- Il me faut une colonne par mois à partir d'un tableau qui a une ligne par mois. Est-ce une transposition ?
- Cela dépend d'une seule chose : le mois apparaît-il plus d'une fois ? Si chaque mois a exactement une ligne, alors oui — le tableau est déjà de la bonne forme et le faire pivoter te donne ce que tu veux. Si un mois apparaît plusieurs fois parce qu'il existe une seconde dimension, région ou produit par exemple, alors non. La rotation te donne des étiquettes de mois répétées en haut et te laisse aussi loin de la réponse qu'avant. Ce qu'il te faut là, c'est un pivot : choisir la clé qui devient les lignes, l'étiquette dont les valeurs distinctes deviennent les colonnes, et la valeur qui atterrit dans les cellules, puis décider de ce qui se passe quand deux lignes sources tombent dans la même cellule — les sommer, les moyenner, ou refuser. Un transposeur ne dispose d'aucune de ces trois entrées et ne peut pas les demander.
Articles qui pourraient t'intéresser
Tous les guides →Outils similaires
Ceci décrit ce que font ces convertisseurs aujourd'hui, vérifié en les exécutant, et non ce qu'une norme imposerait à un convertisseur. Le CSV n'a pas de norme prescriptive : la RFC 4180 est informative et décrit un usage courant, si bien que deux outils apparemment corrects peuvent diverger sur le même fichier sans qu'aucun ait tort. L'aplatissement, la détection de types et celle des tableaux sont des conventions, pas des règles. Avant de convertir des données que tu ne pourras pas réexporter, passe d'abord sur une copie et compare le nombre de lignes et de colonnes aux deux bouts.
Sources
- IETF — RFC 4180, Common Format and MIME Type for Comma-Separated Values (CSV) Files — section 2 rule 4 on each record containing the same number of fields, and rule 6 on quoting a field that holds a delimiter or a line break
- W3C — Model for Tabular Data and Metadata on the Web — the abstract model of a table as rows and columns of cells, and the annotations that a bare CSV file cannot carry
- Journal of Statistical Software — Hadley Wickham, Tidy Data, volume 59 issue 10, 2014 — the distinction between long and wide layouts and why reshaping between them is a grouping operation rather than a rotation (open access)
- pandas — User guide, Reshaping and pivot tables — pivot, pivot_table and melt, and the aggregation function a pivot needs when two source rows fall into the same cell
Tu as repéré une erreur dans cet article ?