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.

Ressemble à un changement, mais rarement
Ce que vous voyez dans le diffEst-ce un vrai changement ?Que faire
Lignes dans un ordre différentNon, si les données sont le même ensembleTriez les deux fichiers par une colonne clé
Délimiteur virgule vs point-virguleNon, mêmes champsNormalisez vers un seul délimiteur
Ada vs "Ada"Non, les guillemets sont optionnels iciNormalisez les guillemets
Fins de ligne CRLF vs LFNonNormalisez les fins de ligne
Une ligne vide à la finNonSupprimez-la
La valeur d'une cellule a changéOuiInvestiguez, 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éthodeIdéale pourEffortComprend le CSV ?
Inspection visuelleFichiers minuscules, quelques lignesFaibleNon, c'est vous le parser
Outil de diff en ligneVérifications rapides, coller de n'importe oùFaibleLigne par ligne, oui
Application tableurRevue visuelle, formules, filtrageMoyenOui, mais manuel
Ligne de commande (sort, csvkit)Gros fichiers, scripting, comparaisons par cléMoyenOui, 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.

  1. Assurez-vous que les deux fichiers utilisent le même délimiteur et ont la même ligne d'en-tête.
  2. Si l'ordre des lignes n'importe pas, triez d'abord les deux fichiers par une colonne clé.
  3. Ouvrez l'outil de comparaison CSV.
  4. Collez l'original à gauche, la nouvelle version à droite.
  5. 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 :

Ce qui a vraiment changé
Ligne (par id)ColonneAvantAprèsChangement
7roleeditoradminModifié
7seats35Modifié
8Aucun 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ègePourquoi ça mordSolution
Délimiteurs non concordantsVirgule vs point-virgule fait paraître chaque champ différentNormalisez vers un seul délimiteur d'abord
BOM au débutUne marque d'ordre des octets cachée change la première cellule d'en-têteRetirez le BOM avant de comparer
IDs avec zéros en têteUn tableur peut avoir transformé 007 en 7Gardez les colonnes d'ID en texte ; comparez comme chaînes
Sauts de ligne intégrésUn champ entre guillemets peut contenir un saut de ligne, décalant chaque ligne suivanteUtilisez un vrai parser CSV, pas une division par lignes
Espaces en fin de celluleDes espaces invisibles apparaissent comme un changementCoupez 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é.