Data Cleaning Horror Stories: Lessons from 10 Years of Messy CSVs

March 2026 · 19 min read · 4,565 words · Last Updated: March 31, 2026Advanced
# Histoires d'Horreur sur le Nettoyage des Données : Leçons de 10 ans de CSV en Désordre Un seul caractère Unicode invisible dans un en-tête de CSV a causé une erreur de facturation de 340 000 $ dans une entreprise de télécommunications avec laquelle j'ai travaillé en 2019. Le fichier avait l'air parfait dans Excel, Notepad++, VS Code, et même lorsqu'il était passé par `cat` dans le terminal. Chaque inspection visuelle montrait des noms de colonnes propres et correctement formatés. Mais le système de facturation continuait de rejeter le champ "customer_id", affirmant qu'il n'existait pas. Trois semaines. C'est le temps qu'il a fallu à cinq ingénieurs, deux analystes de données et un chef de projet très stressé pour trouver le problème. Nous avons réécrit des scripts d'importation, questionné nos schémas de base de données, et même soupçonné un bogue dans notre pipeline ETL. La réponse ? Un caractère non-jointer à largeur nulle (U+200C) assis invisiblement entre "customer" et "_id". L'en-tête n'était pas "customer_id" — c'était "customer‌_id". Aux yeux de chaque humain, identique. Pour chaque système informatique, des champs complètement différents. Cet incident a coûté à l'entreprise 340 000 $ en cycles de facturation retardés, heures d'urgence des contrats, et crédits clients pour factures tardives. Cela m'a également appris la leçon la plus importante de ma carrière : les fichiers CSV ne sont pas simples. Ce sont des champs de mines déguisés en feuilles de calcul, et chaque ingénieur de données doit les traiter avec la paranoïa qu'ils méritent. J'ai passé la dernière décennie à nettoyer des ensembles de données pour des entreprises du Fortune 500 dans les domaines de la finance, de la santé, du commerce de détail et des télécommunications. J'ai vu des cauchemars d'encodage qui ont corrompu des dossiers de patients, des espaces fantômes qui ont cassé des rapprochements financiers, et des formats de date si créatifs qu'ils n'auraient pu être conçus que par quelqu'un qui détestait vraiment les futurs ingénieurs de données. Cet article est ma tentative de vous sauver de la même douleur.

L'Apocalypse de l'Encodage : Quand UTF-8 N'est Pas UTF-8

Le pire désastre de données que j'ai jamais été témoin s'est produit dans une chaîne de magasins de détail multinationale en 2017. Ils consolidaient les données clients provenant de 47 bases de données régionales à travers 12 pays en un seul entrepôt de données. Assez simple, non ? Exporter vers CSV, importer dans l'entrepôt, exécuter une logique de dé-duplication, et c'est tout. Sauf que les CSV de la division française continuaient de corrompre des noms. "François" est devenu "François". "Chloé" est devenu "Chloé". La division allemande avait des problèmes similaires avec les umlauts. Les données de la division japonaise étaient complètement illisibles — juste des lignes de points d'interrogation et de caractères de remplacement. La cause profonde ? Chaque équipe régionale avait exporté ses CSV en utilisant des encodages différents. La France utilisait l'ISO-8859-1 (Latin-1). L'Allemagne utilisait le Windows-1252. Le Japon utilisait le Shift-JIS. Les équipes du Royaume-Uni et des États-Unis utilisaient l'UTF-8, mais certaines avaient l'UTF-8 avec BOM (Byte Order Mark) et d'autres sans. Une équipe en Espagne avait d'une manière ou d'une autre exporté ses données en UTF-16LE. Le projet de consolidation, initialement planifié pour trois mois, a duré onze mois. Nous avons dû construire un pipeline de détection d'encodage personnalisé qui allait : 1. Tenter de détecter l'encodage à l'aide de plusieurs bibliothèques (chardet, charset-normalizer, et une heuristique personnalisée) 2. Valider la détection en vérifiant les motifs de caractères courants dans chaque langue 3. Convertir le tout en UTF-8 sans BOM 4. Enregistrer chaque conversion avec des scores de confiance pour une révision manuelle Même avec ce pipeline, nous avons eu un taux d'erreur de 3 % nécessitant une correction manuelle. Cela représente 3 % de 47 millions de dossiers clients — 1,4 million de noms nécessitant une révision humaine. La leçon ? Ne faites jamais confiance à l'encodage d'un CSV. Jamais. Même si quelqu'un vous dit "c'est définitivement de l'UTF-8", vérifiez-le. J'ai vu des fichiers prétendant être en UTF-8 dans leurs métadonnées mais qui étaient en réalité du Windows-1252 avec des caractères haut-ASCII. J'ai vu des fichiers UTF-8 avec des morceaux aléatoires en ISO-8859-1 où quelqu'un a copié-collé d'un ancien système. J'ai même vu un fichier qui changeait d'encodage à mi-chemin parce que le script d'exportation a planté et redémarré avec des paramètres régionaux différents. Maintenant, chaque CSV qui traverse mon bureau est exécuté à travers un script de validation d'encodage avant même que je ne regarde les données. Cela m'a fait économiser d'innombrables heures et a permis d'éviter au moins une douzaine d'incidents majeurs.

L'Espace Blanc Qui N'Était Pas Là (Sauf Qu'il L'Était)

En 2018, j'ai été appelé pour réparer un système de réconciliation financière qui échouait depuis six mois. L'entreprise était un processeur de paiement gérant des milliards de dollars de transactions. Leur processus de réconciliation comparait les enregistrements de transactions de leur base de données avec des rapports CSV de partenaires bancaires. Le système signalait des milliers de discordances chaque jour — des transactions apparues dans les rapports bancaires mais pas dans leur base de données, ou vice versa. L'équipe financière analysait manuellement ces discordances, travaillant des semaines de 60 heures pour suivre le rythme. Ils vérifiaient chaque transaction signalée et découvraient qu'elle existait en réalité dans les deux systèmes. Les identifiants de transaction correspondaient parfaitement. Mais le système automatisé continuait à les signaler comme des discordances. J'ai passé deux jours à analyser le code, les requêtes de base de données et la logique d'analyse CSV. Tout semblait correct. Puis j'ai fait quelque chose qui aurait dû être évident depuis le début : j'ai ouvert le CSV dans un éditeur hexadécimal. Là, c'était. Chaque identifiant de transaction dans les fichiers CSV de la banque avait un espace final. Pas visible dans Excel. Pas visible dans la plupart des éditeurs de texte. Mais là, dans le vidage hexadécimal : `54 52 41 4E 53 31 32 33 34 35 20` au lieu de `54 52 41 4E 53 31 32 33 34 35`. Ce dernier `20` était un caractère d'espace. La base de données stockait les identifiants de transaction sans espaces finaux. La logique de comparaison effectuait une correspondance exacte entre les chaînes. "TRANS12345" ≠ "TRANS12345 ". Des milliers de fausses discordances, des centaines d'heures de travail perdues, tout à cause d'un seul caractère d'espace final. Mais voici où cela devient pire : les espaces finaux n'étaient pas cohérents. Certains identifiants de transaction en avaient, d'autres n'en avaient pas. Certains avaient des espaces finaux, d'autres des espaces de début, et certains avaient les deux. Quelques-uns avaient des tabulations à la place des espaces. Un fichier mémorable avait un mélange d'espaces, de tabulations et d'espaces insécables (U+00A0). La solution était simple : couper tous les espaces blancs lors de l'importation. Mais la leçon était profonde : l'espace blanc dans les CSV n'est jamais accidentel, toujours problématique, et fréquemment invisible. J'ai maintenant une règle : chaque champ de chaîne est coupé à l'importation, sans exception. Peu importe si la logique métier dit que le champ doit préserver les espaces. Peu importe si quelqu'un insiste sur le fait que les données sont propres. Coupez tout. J'ai également appris à faire attention à d'autres caractères invisibles : espaces à largeur nulle (U+200B), non-jointers à largeur nulle (U+200C), jointers à largeur nulle (U+200D), et le redouté marqueur d'ordre de byte (U+FEFF) qui apparaît parfois au milieu des fichiers. Ces caractères sont les fantômes dans la machine, invisibles aux humains mais très réels pour les ordinateurs.

Le Format de Date Qui a Cassé le Commerce International

Laissez-moi vous parler de la fois où j'ai rencontré un format de date si maudit, si fondamentalement cassé, qu'il hante encore mes rêves. C'était dans une entreprise de logistique qui coordonnait des expéditions entre des fabricants en Asie et des détaillants en Amérique du Nord et en Europe. Le système fonctionnait comme ceci : les fabricants téléversaient des fichiers CSV avec les détails d'expédition, notamment les dates de ramassage, les dates de livraison estimées et les dates de dédouanement. Le système analysait ces dates, calculait les temps de transit et coordonnait avec les entreprises de transport et les courtiers en douane. Tout fonctionnait bien pendant des années. Puis, en mars 2016, le système a commencé à programmer des expéditions pour des dates passées. Des conteneurs qui auraient dû être ramassés le 15 mars 2016 étaient programmés pour le 15 mars 1916. Des documents douaniers étaient déposés pour des dates antérieures à l'invention du transport par conteneurs. La cause profonde ? Le formatage automatique des dates d'Excel combiné aux différences de format de date régionales et à un malentendu véritablement spectaculaire sur la manière dont les dates fonctionnent. Voici ce qui se passait : 1. Un fabricant en Chine saisissait une date comme "3/15/2016" (15 mars 2016 au format MM/JJ/YYYY) 2. Excel interprétait cela comme une date et le stockait en interne sous forme de numéro de série (42444 pour le 15 mars 2016) 3. Lorsqu'il était exporté vers CSV, Excel le formatait selon le paramètre régional du système 4. Le paramètre régional du système chinois utilisait le format AAAA-MM-JJ, donc il était exporté comme "2016-03-15" 5. Notre système d'importation, configuré pour le format MM/JJ/YYYY, analysait "2016-03-15" comme "2016/03/15" (le 2016ème mois, 3ème jour, année 15) 6. Comme le mois 2016 est invalide, l'analyse revenait à l'interpréter comme "20/16/03/15" 7. Grâce à une série de tentatives d'analyse de plus en plus désespérées, il finissait par se fixer sur "03/15/1916" Mais attendez, ça devient pire. Certains fabricants utilisaient le format JJ/MM/AAAA. D'autres utilisaient AAAA-MM-JJ. Certains utilisaient MM/JJ/AA (années à deux chiffres). Et un fabricant à Taïwan utilisait le calendrier Minguo, où l'année 105 correspond à 2016 EC (1912 + 105). Nous avons fini avec des dates s'étendant de 1916 à 2116, avec un cluster particulièrement dense autour de 1970 (l'époque Unix) parce que certains systèmes exportaient des dates sous forme de timestamps Unix et notre analyseur les interprétait comme un format AAAAMMJJ. La solution nécessitait : - La mise en œuvre d'un analyseur de dates multi-stratégies qui tentait de détecter le format - L'ajout de règles de validation (rejet des dates avant 2000 ou après 2050) - L'exigence pour les fabricants d'utiliser exclusivement le format ISO 8601 (AAAA-MM-JJ) - La création d'une interface web pour les téléversements CSV qui prévisualiserait les dates analysées avant l'importation - La création d'une suite de tests complète avec des dates dans tous les formats imaginables Même avec toutes ces protections, nous avons encore de temps en temps des erreurs d'analyse de date. Le mois dernier, j'ai rencontré un CSV où quelqu'un avait entré "2/29/2023" (29 février 2023 — une date qui n'existe pas parce que 2023 n'est pas une année bissextile). Excel l'a joyeusement accepté, l'a stocké sous forme de numéro de série 45000, et l'a exporté comme "2023-02-29". Notre système l'a importé, a validé qu'il était au bon format, et a programmé une expédition pour une date qui n'existe pas.
"Le problème avec les dates, c'est que tout le monde pense les comprendre, mais personne ne le fait réellement. Les dates sont des constructions culturelles, pas mathématiques. Elles ont des fuseaux horaires, des heures d'été, des années bissextiles, des secondes intercalaires et des réformes calendaires. Elles ont des formats différents dans des pays différents, des points de départ différents dans des époques différentes, et des significations différentes dans des contextes différents. Et les fichiers CSV, avec leur manque complet de métadonnées, ne vous permettent pas de savoir quelle interprétation est correcte."
Cette citation d'un collègue capture parfaitement le problème de la date. Les CSV n'ont pas de types de données. Ils n'ont pas de schémas. Ce ne sont que des textes. Quand vous voyez "01/02/03" dans un CSV, est-ce que cela signifie 2 janvier 2003 ? 1er février 2003 ? 2 mars 2001 ? 3 février 2001 ? Il n'y a aucun moyen de le savoir sans contexte, et le contexte est exactement ce que les CSV ne fournissent pas.

Les Nombres Qui N'Étaient Pas des Nombres

Voici un tableau des problèmes de données numériques les plus courants que j'ai rencontrés, avec leur fréquence et leur impact typique :
Type de Problème Fréquence Impact Typique Exemple
Séparateurs de milliers Très Élevé (60%) Échecs d'importation, erreurs de type "1,234.56" analysé comme chaîne
Symboles monétaires Élevé (45%) Échecs d'importation, erreurs de calcul "$1,234.56" ou "€1.234,56"
Différences de séparateur décimal Élevé (40%) Erreurs de calcul catastrophiques "1.234,56" (européen) contre "1,234.56" (américain)
Notation scientifique Moyen (25%) Perte de précision, mauvaise interprétation "1.23E+05" ou "1.23456789E-10"
Zéros initiaux Moyen (30%) Perte de données, corruption d'identifiants "00123" devient "123"
Signe de pourcentage Moyen (20%) Erreurs de calcul multipliées par 100 "15%" stocké comme 15 au lieu de 0.15
Formats de nombre négatif Bas (15%) Perte de signe, calculs incorrects "(123"
C

Written by the CSV-X Team

Our editorial team specializes in data analysis and spreadsheet management. We research, test, and write in-depth guides to help you work smarter with the right tools.

Share This Article

Twitter LinkedIn Reddit HN

Put this into practice

Try Our Free Tools →

📬 Stay Updated

Get notified about new tools and features. No spam.