Les exports CSV des banques sont hostiles de façon très régulière, et connaître la liste transforme un fichier déroutant en travail de cinq minutes. Chacun des problèmes ci-dessous est un choix de mise en forme de la banque, pas un fichier abîmé :
- Des lignes d'en-tête avant le tableau. Nom du compte, code guichet (sort code), période et une ligne vide avant la vraie ligne d'en-têtes. Tout analyseur que vous lancez sur le fichier prendra la première de ces lignes pour les noms de colonnes.
- Deux colonnes de montant,
DebitetCredit, au lieu d'un seul montant signé. Ou un montant signé dont la convention de signe est l'inverse de celle que vous attendez. - Des dates ambiguës.
03/04/2026est le 3 avril au Royaume-Uni et le 4 mars aux États-Unis, et le fichier ne dit pas lequel. - Une colonne de description qui contient cinq champs à la fois : commerçant, lieu, numéro de carte, référence et type d'opération propre à la banque.
- Des montants en texte, avec séparateurs de milliers, symboles monétaires, ou négatifs écrits
(45.00).
Réglez ces cinq points et le fichier devient une donnée ordinaire.
D'abord, comprendre la forme du fichier
Ouvrez le fichier et regardez ses dix premières lignes avant toute chose :
head -n 12 statement.csv
Comptez les lignes d'en-tête et repérez la vraie ligne de titres. Ensuite, sautez-les :
tail -n +5 statement.csv > clean.csv
Si vous l'ouvrez plutôt dans un tableur, supprimez ces lignes avant de faire quoi que ce soit d'autre. Trier ou filtrer en les laissant en place met le récapitulatif du compte au milieu de vos opérations, où il est difficile à repérer et facile à inclure dans un total.
Les dates, le piège
C'est l'erreur qui donne des résultats faux plutôt qu'une panne évidente. Un analyseur au format américain qui lit un relevé britannique convertit sans rien dire le 3 avril en 4 mars pour tous les jours jusqu'au douze du mois, et laisse les autres tranquilles. Le résultat paraît tout à fait normal, et chaque total mensuel est faux.
Deux façons de trancher, de la plus fiable à la moins fiable :
Trouver un jour supérieur à 12. Parcourez la colonne des dates à la recherche d'une valeur comme 25/12/2026. Si le premier nombre dépasse douze, le format est jour d'abord. Cela prend dix secondes et c'est définitif.
Comparer avec une opération dont vous vous souvenez. Tout ce que vous pouvez dater de mémoire règle la question immédiatement.
Convertissez ensuite explicitement, plutôt que de laisser un outil deviner :
duckdb -c "SELECT strptime(\"Transaction Date\", '%d/%m/%Y') d, * FROM read_csv('clean.csv', all_varchar=true)"
all_varchar=true est la moitié importante : le lecteur cesse totalement de deviner les types, et c'est vous qui décidez de chaque conversion. Cela protège aussi les numéros de référence et les chiffres de compte, qui arriveraient sinon sous forme de nombres décimaux.
Normaliser le montant
Il vous faut une seule colonne numérique signée, et il y a trois formes de départ.
Colonnes Debit et Credit séparées. On les combine, avec les débits en négatif :
COALESCE(-TRY_CAST(replace("Debit", ',', '') AS DOUBLE), TRY_CAST(replace("Credit", ',', '') AS DOUBLE), 0)
Texte avec séparateurs ou symboles. Supprimez tout ce qui n'est pas un chiffre, un signe moins ou un point décimal avant la conversion. £1,234.56 et 1 234,56 en ont tous deux besoin, et le second demande en plus de traiter la virgule décimale.
Négatifs comptables. (45.00) signifie −45,00. Rien ne le convertit correctement par défaut : remplacez d'abord les parenthèses.
Vérifiez ensuite la conversion avant de vous fier à un total : le nombre de montants non nuls doit être égal au nombre de lignes d'opérations. Un TRY_CAST qui échoue vous donne un NULL silencieux, et un NULL dans une SUM est tout simplement absent, ce qui fait qu'un total est faux de façon plausible plutôt que visiblement cassé.
Découper la colonne de description
C'est dans la description que se cache l'information utile, et elle arrive sous forme d'une seule chaîne :
CARD PAYMENT TO TESCO STORES 3421 ON 02-04-2026 GBP 43.19
Il est rare d'avoir besoin d'un analyseur complet. Deux opérations couvrent l'essentiel :
Une colonne commerçant, en comparant avec une liste de noms qui vous intéressent. Vingt clauses CASE WHEN description LIKE '%TESCO%' THEN 'Tesco' classeront la grande majorité d'un relevé personnel, et la longue traîne ne vaut pas la peine d'être automatisée.
Une colonne type d'opération, à partir du préfixe. CARD PAYMENT, DIRECT DEBIT, FASTER PAYMENT, ATM. Les banques sont constantes sur ce point au sein d'un même export, et regrouper par type est souvent plus instructif que regrouper par commerçant.
Ce qu'il ne faut pas tenter : extraire un montant ou une date fiable depuis la description. Les deux existent déjà en colonnes, et les copies intégrées au texte sont formatées différemment et ne concordent parfois pas.
Puis poser la vraie question
Une fois que le fichier a une date, un montant signé et un commerçant, chaque question tient en une ligne :
SELECT strftime(d, '%Y-%m') month, sum(amount) FROM tx GROUP BY month ORDER BY month
SELECT merchant, count(*) n, sum(amount) FROM tx WHERE amount < 0 GROUP BY merchant ORDER BY sum(amount) LIMIT 20
SELECT * FROM tx WHERE amount < -100 ORDER BY amount
Solde net par mois, plus grosses dépenses par commerçant, tout ce qui dépasse cent. Ces trois requêtes répondent à l'essentiel de ce pour quoi on ouvre un relevé.
Le SQL et l'éditeur de filtres visuel s'exécutent tous deux sur le fichier, là où il se trouve, ce qui compte quand c'est un export bancaire que vous préférez ne téléverser nulle part. Les graphiques viennent de la même requête : un total mensuel devient un histogramme dans la même étape.
Ce que ça faitCette dernière considération mérite d'être dite franchement. Un relevé bancaire fait partie des fichiers les plus sensibles que la plupart des gens manipulent : chaque commerçant, chaque lieu, chaque paiement récurrent, et souvent un numéro de compte partiel. Les visionneuses CSV en ligne gratuites et les sites « convertissez votre relevé » téléversent l'ensemble vers un serveur dont vous ne savez rien. Pour ce fichier en particulier, un outil qui travaille en local n'est pas une lubie : c'est le choix évident par défaut.
Préparer le fichier pour quelqu'un d'autre
Souvent, si vous avez ouvert le relevé, c'est que quelqu'un en a besoin d'une partie : un comptable, un propriétaire, une note de frais. Le travail consiste à retirer :
- Gardez les colonnes qui comptent : date, description, montant. Supprimez le reste, y compris le solde courant et les chiffres du compte.
- Filtrez sur la période ou la catégorie réellement demandée.
- Ajoutez une colonne de catégorie si on vous en réclamera une.
- Exportez, puis vérifiez que le total de l'export correspond à celui de votre filtre.
Masquer la colonne du solde mérite d'être fait volontairement plutôt que de la laisser par paresse, car elle en dit bien plus que les opérations elles-mêmes.
Supprimer des colonnes, filtrer sur une période et ajouter une colonne de catégorie calculée sont ici de simples modifications directes, et les colonnes de formules enregistrent leurs résultats dans le CSV : le fichier que vous remettez est un CSV ordinaire qui s'ouvre correctement dans l'outil du destinataire.
Ce que ça faitPlusieurs mois, plusieurs comptes
Les banques exportent une période à la fois, donc toute question portant sur une année passe par plusieurs fichiers. Deux choses à faire avant de les combiner :
Vérifiez que les en-têtes correspondent. Les banques changent de format d'export d'une année à l'autre, et une colonne qui a changé de place décale tout ce qui suit si vous concaténez à l'aveugle. Comparez d'abord les lignes d'en-têtes ; le guide pour fusionner des fichiers CSV décrit la fusion par nom de colonne, qui résiste à ce problème.
Ajoutez une colonne de compte avant de combiner des fichiers de comptes différents. Sans elle, un virement entre vos propres comptes apparaît deux fois, une fois en sortie et une fois en entrée, et tout total qui l'ignore se trompe du double du montant du virement. Marquer la source, puis exclure explicitement les virements internes, est le seul moyen d'obtenir un total de foyer qui ait un sens.