Comparer deux fichiers CSV et voir ce qui a changé
Le moyen le plus rapide de comparer deux fichiers CSV est de les coller tous les deux dans un outil de diff côte à côte, d'aligner les colonnes et de lire les lignes qu'il met en évidence. La comparaison, c'est la partie facile. C'est le bruit qui piège les gens : un export réordonné, un point-virgule au lieu d'une virgule, ou une valeur que quelqu'un a entourée de guillemets peuvent faire que deux fichiers contenant les mêmes données semblent n'avoir rien en commun.
Ce guide explique comment obtenir un diff CSV propre et fiable. Nous verrons pourquoi deux exports équivalents s'éloignent sur le papier, quelles méthodes valent la peine d'être connues, et un exemple concret que vous pouvez suivre. Si vous voulez juste l'outil, notre page de comparaison CSV fait tout cela dans le navigateur.
Pourquoi les fichiers CSV sont étonnamment difficiles à comparer
Le CSV paraît simple, mais il n'a pas de standard strict unique. Ce qui s'en rapproche le plus est la RFC 4180, et beaucoup de fichiers réels ne la suivent pas. Deux exports de la même table peuvent différer par le délimiteur, les guillemets, les fins de ligne et l'ordre des lignes tout en décrivant exactement les mêmes données. Un diff de texte brut n'en sait rien, alors il signale tout.
Voici la chose essentielle à décider avant de commencer : l'ordre des lignes vous importe-t-il ? Un export de base de données trié par nom et le même export trié par ID contiennent l'ensemble identique d'enregistrements, mais un diff de lignes peindra presque chaque ligne en rouge et vert. Si les lignes ont une clé stable (une colonne d'ID), trier d'abord les deux fichiers par cette clé rend le diff à nouveau lisible.
| Ce que vous voyez dans le diff | Est-ce un vrai changement ? | Que faire |
|---|---|---|
| Lignes dans un ordre différent | Non, si les données sont le même ensemble | Triez les deux fichiers par une colonne clé |
| Délimiteur virgule vs point-virgule | Non, mêmes champs | Normalisez vers un seul délimiteur |
Ada vs "Ada" | Non, les guillemets sont optionnels ici | Normalisez les guillemets |
| Fins de ligne CRLF vs LF | Non | Normalisez les fins de ligne |
| Une ligne vide à la fin | Non | Supprimez-la |
| La valeur d'une cellule a changé | Oui | Investiguez, c'est réel |
La ligne du délimiteur piège beaucoup de monde, surtout entre régions : de nombreuses locales européennes utilisent le point-virgule parce que la virgule est le séparateur décimal. Mêmes données, séparateur différent. Si vous voulez le détail sur la façon dont les navigateurs et les outils lisent du texte tabulaire, la note de MDN sur la lecture de fichiers dans le navigateur est un bon point de départ.
Quatre façons de comparer le CSV et quand y recourir
Il n'y a pas de meilleure méthode unique. Cela dépend de la taille des fichiers et de l'importance de l'ordre des lignes. Voici comment se comparent les options courantes.
| Méthode | Idéale pour | Effort | Comprend le CSV ? |
|---|---|---|---|
| Inspection visuelle | Fichiers minuscules, quelques lignes | Faible | Non, c'est vous le parser |
| Outil de diff en ligne | Vérifications rapides, coller de n'importe où | Faible | Ligne par ligne, oui |
| Application tableur | Revue visuelle, formules, filtrage | Moyen | Oui, mais manuel |
Ligne de commande (sort, csvkit) | Gros fichiers, scripting, comparaisons par clé | Moyen | Oui, quand vous triez d'abord |
Pour la plupart des gens, un outil de navigateur l'emporte sur la vitesse : rien à installer, et vous pouvez coller un export directement depuis un téléchargement ou un client de base de données. Le piège, c'est le bruit de l'ordre des lignes et du délimiteur, que nous traitons ensuite. Pour les très gros fichiers, csvkit en ligne de commande vaut la peine d'être appris.
La comparaison propre la plus rapide, étape par étape
Voici la routine que j'utilise quand on me tend deux exports en demandant « qu'est-ce qui est différent ? » Cela prend moins d'une minute.
- Assurez-vous que les deux fichiers utilisent le même délimiteur et ont la même ligne d'en-tête.
- Si l'ordre des lignes n'importe pas, triez d'abord les deux fichiers par une colonne clé.
- Ouvrez l'outil de comparaison CSV.
- Collez l'original à gauche, la nouvelle version à droite.
- Lisez le résultat. Le vert est une ligne ajoutée, le rouge une ligne supprimée, et une cellule modifiée apparaît comme une de chaque couleur.
L'étape deux est toute l'astuce quand les lignes ne sont pas ordonnées. Une fois les deux fichiers triés de la même façon, il ne reste à mettre en évidence que les lignes qui ont réellement changé. Notre moteur de diff repose sur le diff-match-patch de Google, qui compare ligne par ligne d'abord pour rester rapide même sur les longs fichiers.
Un exemple concret
Supposons que vous examinez une modification d'une table d'utilisateurs. Voici l'avant :
id,name,role,seats
7,Ada Lovelace,editor,3
8,Alan Turing,viewer,1
Et voici l'après, exporté dans un ordre de lignes différent :
id,name,role,seats
8,Alan Turing,viewer,1
7,Ada Lovelace,admin,5
Jetez-les dans un diff de lignes brut et les deux lignes de données
semblent modifiées, parce qu'elles ont échangé leur position. Triez les
deux par la colonne id, et la véritable histoire est courte :
| Ligne (par id) | Colonne | Avant | Après | Changement |
|---|---|---|---|---|
| 7 | role | editor | admin | Modifié |
| 7 | seats | 3 | 5 | Modifié |
| 8 | — | — | — | Aucun changement (déplacé seulement) |
Une seule vraie modification : le rôle et le nombre de sièges d'Ada ont
changé. La ligne d'Alan a seulement été déplacée. Cette promotion d'
editor à admin est exactement le genre de chose
que vous voulez repérer en revue, et c'est facile à manquer quand c'est
enseveli sous des lignes que le diff a signalées à tort comme modifiées.
Éliminer le bruit de l'ordre des lignes en ligne de commande
Si vos fichiers sont déjà sur le disque et que les lignes n'ont pas d'ordre inhérent, la même idée de « trier d'abord » fonctionne avec deux commandes courtes. Gardez l'en-tête en place et triez le reste :
(head -1 old.csv; tail -n +2 old.csv | sort) > old.sorted.csv
(head -1 new.csv; tail -n +2 new.csv | sort) > new.sorted.csv
diff old.sorted.csv new.sorted.csv
Maintenant diff ne signale que les lignes réellement modifiées,
parce que les deux fichiers sont dans le même ordre. Pour des comparaisons
par clé qui ignorent aussi l'ordre des colonnes, csvsort et
csvjoin de csvkit vous donnent plus de contrôle. C'est
l'équivalent en terminal du tri des deux côtés avant de comparer dans le
navigateur.
Délimiteurs, guillemets et la réalité désordonnée
Les vrais fichiers CSV enfreignent les règles en permanence. Un champ qui
contient une virgule doit être entre guillemets, donc "Lovelace, Ada"
est un champ, pas deux. Les guillemets à l'intérieur d'un champ entre
guillemets sont doublés : "Elle a dit ""salut""". Et le
séparateur lui-même varie : les tableurs dans les locales à virgule décimale
exportent avec des points-virgules, et les fichiers séparés par des
tabulations (TSV) sont courants dans les pipelines de données. Avant de
comparer, assurez-vous que les deux fichiers utilisent le même délimiteur et
la même convention de guillemets, ou normalisez-les avec un parser qui suit
la RFC 4180. Sinon le diff compare deux dialectes différents, pas deux
versions des mêmes données.
Pièges courants à surveiller
| Piège | Pourquoi ça mord | Solution |
|---|---|---|
| Délimiteurs non concordants | Virgule vs point-virgule fait paraître chaque champ différent | Normalisez vers un seul délimiteur d'abord |
| BOM au début | Une marque d'ordre des octets cachée change la première cellule d'en-tête | Retirez le BOM avant de comparer |
| IDs avec zéros en tête | Un tableur peut avoir transformé 007 en 7 | Gardez les colonnes d'ID en texte ; comparez comme chaînes |
| Sauts de ligne intégrés | Un champ entre guillemets peut contenir un saut de ligne, décalant chaque ligne suivante | Utilisez un vrai parser CSV, pas une division par lignes |
| Espaces en fin de cellule | Des espaces invisibles apparaissent comme un changement | Coupez les valeurs des cellules avant de comparer |
Quand un tableur est le meilleur outil
Un diff de texte est parfait pour repérer quelles lignes ont changé et examiner le changement comme des données. Mais si vous devez filtrer, faire un tableau croisé ou comparer par formule sur des milliers de lignes, un tableur convient mieux : importez les deux fichiers, alignez-les par clé et utilisez une recherche pour signaler les écarts. Les deux approches se complètent. Utilisez le diff pour une lecture visuelle rapide et le tableur quand vous devez découper les données. Pour les règles du format sous-jacent dans les deux cas, l' aperçu du CSV sur Wikipedia est une référence solide.
Outils connexes
Le CSV est rarement le seul format que vous manipulez. Si les mêmes données vivent aussi en JSON, comparer JSON applique la même idée. Dédupliquer une colonne de valeurs est rapide avec supprimer les lignes en double, et mettre les lignes dans un ordre prévisible avant un diff, c'est à quoi sert trier les lignes.
Questions fréquentes
- Comparer des fichiers CSV en ligne les téléverse-t-il quelque part ?
- Sur comparetext.org, le diff s'exécute dans votre navigateur. Les deux fichiers CSV sont comparés par JavaScript sur votre propre machine, donc rien n'est envoyé à un serveur sauf si vous cliquez explicitement sur Enregistrer ou Partager. Cela le rend sûr pour les exports clients, les données financières et autres tableurs que vous ne voudriez pas coller dans un site qui téléverse à chaque frappe.
- Pourquoi mes deux fichiers CSV affichent-ils chaque ligne comme différente ?
- C'est presque toujours l'ordre des lignes ou le délimiteur, pas de vrais changements. Un export est trié différemment de l'autre, ou l'un utilise des virgules et l'autre des points-virgules, ou les fins de ligne diffèrent. Assurez-vous que les deux fichiers utilisent le même délimiteur, puis triez les deux par une colonne clé pour que l'ordre cesse d'importer. Après cela, le diff se réduit généralement à la poignée de lignes et de cellules qui ont vraiment changé.
- Comment comparer deux fichiers CSV en ignorant l'ordre des lignes ?
- Triez les deux fichiers par une colonne clé stable avant de comparer. Si les lignes ont un ID, triez dessus ; sinon, triez la ligne entière. Gardez la ligne d'en-tête en place et triez uniquement les lignes de données. Dans le navigateur, vous pouvez coller les versions triées ; en ligne de commande, triez le fichier après l'en-tête. Une fois les deux fichiers dans le même ordre, seules les lignes qui ont réellement changé apparaissent dans le diff au lieu de chaque ligne qui s'est simplement déplacée.
- Pourquoi mon CSV utilise-t-il des points-virgules au lieu de virgules ?
- De nombreuses locales européennes utilisent la virgule comme séparateur décimal, donc les tableurs exportent le CSV avec un délimiteur point-virgule pour éviter l'ambiguïté. Les données sont les mêmes ; seul le séparateur diffère. Avant de comparer deux fichiers, assurez-vous qu'ils utilisent le même délimiteur, sinon vous verrez chaque champ signalé comme modifié. Normaliser les deux vers des virgules (ou les deux vers des points-virgules) avec un outil qui comprend le CSV règle le problème. Les fichiers séparés par des tabulations ont le même souci avec un séparateur différent.
- Comment comparer des fichiers CSV aux ordres de colonnes différents ?
- Un diff de texte brut compare les lignes de gauche à droite, donc des colonnes réordonnées paraissent un changement total même quand les données concordent. Pour gérer cela, réordonnez d'abord les colonnes pour qu'elles concordent dans les deux fichiers, ou utilisez un outil qui comprend le CSV et compare par nom d'en-tête plutôt que par position. Des outils en ligne de commande comme csvkit peuvent sélectionner et réordonner les colonnes par nom. Une fois les colonnes alignées dans le même ordre, un diff normal ligne par ligne fonctionne à nouveau.
- Puis-je comparer de gros fichiers CSV sans que la page se fige ?
- Oui, jusqu'à un certain point. Un diff en mode ligne reste rapide sur des fichiers de milliers de lignes parce qu'il compare des lignes entières d'abord au lieu de chaque caractère. Les très gros fichiers (des dizaines de mégaoctets ou des millions de lignes) sont mieux gérés avec un outil en ligne de commande comme csvkit ou un import en base de données, qui diffusent les données. Pour un export que vous pouvez confortablement faire défiler dans un navigateur, un diff en ligne est l'option la plus rapide.
Prêt à essayer ? Collez vos fichiers dans l' outil de comparaison CSV et voyez ce qui a changé.