mygems

Comment lire un relevé bancaire CSV

Lignes d'en-tête, deux colonnes de montant, dates ambiguës et tout dans la description. Voici comment faire répondre un export bancaire à une question.

Par uos ·

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, Debit et Credit, 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/2026 est 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é.

CSV File Viewer - Smart CSViPhone et iPad · Android

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 fait

Cette 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 :

  1. Gardez les colonnes qui comptent : date, description, montant. Supprimez le reste, y compris le solde courant et les chiffres du compte.
  2. Filtrez sur la période ou la catégorie réellement demandée.
  3. Ajoutez une colonne de catégorie si on vous en réclamera une.
  4. 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.

CSV Editor - Smart CSViPhone et iPad

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 fait

Plusieurs 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.

Questions

Pourquoi mon CSV de relevé bancaire s'ouvre-t-il avec de mauvais en-têtes de colonnes ?
Parce que la plupart des banques placent des lignes d'en-tête avant les titres (nom du compte, code guichet, période, une ligne vide) et que tout analyseur prend la première ligne qu'il voit pour les noms de colonnes. Regardez les dix premières lignes, comptez les lignes superflues et sautez-les : `tail -n +5 statement.csv > clean.csv`, ou supprimez ces lignes avant toute autre chose dans un tableur.
Comment savoir si les dates sont en jour/mois ou en mois/jour ?
Parcourez la colonne des dates à la recherche d'une valeur dont le premier nombre dépasse douze, comme 25/12/2026, ce qui prouve que le format commence par le jour. C'est plus important qu'il n'y paraît : un analyseur qui attend le mois d'abord, face à un fichier qui commence par le jour, convertit sans rien dire toutes les dates jusqu'au douze et laisse les autres tranquilles. Les totaux sont faux et rien ne paraît cassé.
Comment combiner les colonnes Debit et Credit en un seul montant ?
Convertissez les deux en nombres après avoir retiré séparateurs et symboles monétaires, passez le débit en négatif et fusionnez avec COALESCE : `COALESCE(-TRY_CAST(replace(Debit, ',', '') AS DOUBLE), TRY_CAST(replace(Credit, ',', '') AS DOUBLE), 0)`. Vérifiez ensuite que le nombre de montants non nuls est égal au nombre de lignes. Une conversion qui échoue devient NULL, et un NULL dans une SUM est simplement ignoré, ce qui produit un total faux plutôt qu'une erreur.
Comment catégoriser les opérations d'un CSV bancaire ?
Comparez la description à une liste de noms de commerçants qui vous intéressent avec une série de clauses CASE WHEN ; une vingtaine suffit à classer l'essentiel d'un relevé personnel, et la longue traîne ne vaut pas la peine d'être automatisée. Regrouper plutôt par préfixe de type d'opération (CARD PAYMENT, DIRECT DEBIT, ATM) est souvent plus utile et ne demande aucune liste.
Est-il sûr d'ouvrir un relevé bancaire dans une visionneuse CSV en ligne ?
Cela revient à téléverser chaque commerçant, chaque lieu et chaque paiement récurrent, et souvent un numéro de compte partiel, vers un service dont vous ne savez rien. Pour ce fichier en particulier, utilisez plutôt un outil qui travaille localement sur le fichier, comme un tableur, un outil en ligne de commande local ou une application qui ne téléverse rien, plutôt qu'un convertisseur dans le navigateur.
Comment analyser plusieurs mois de relevés ensemble ?
Vérifiez que les en-têtes correspondent avant de combiner, car les banques changent de format d'export d'une année à l'autre et une colonne déplacée décale tout si vous concaténez à l'aveugle. Ajoutez d'abord une colonne qui identifie le compte. Sans elle, un virement entre vos propres comptes apparaît à la fois en sortie et en entrée, et tout total qui n'exclut pas les virements internes se trompe du double du montant.

uos — Développe CSV Editor et Smart CSV Viewer, et n'a pas encore croisé deux banques qui exportent un relevé de la même façon.