Bank Statement CSV Column Auto-Detection
Upload a sample, let the heuristic engine map your bank's CSV columns, save a reusable template, and import to bank statement lines - for any bank, worldwide.
Stop hand-mapping CSV columns for every bank
Every bank exports its statement CSV differently: comma or semicolon delimiters, dot or comma decimals, ISO or day-first or month-first dates, a single signed amount column or separate debit / credit columns, headers in any language. This module reads a short sample of a real export and proposes a complete column mapping automatically using a transparent heuristic engine - then lets you save that mapping as a reusable template so every future file from that bank imports in one click.
Dialect sniffing
- Field delimiter detection - comma, semicolon, tab or pipe - by field-count consistency scoring.
- Header-row detection: knows when row one is labels versus already data.
- Decimal / thousands separator inference: tells
1.234,56(continental) from1,234.56(US/UK). - Quote-character detection for fields with embedded delimiters.
Date-format inference
- Recognises ISO, day-first, month-first, dotted, slashed, dashed and named-month layouts.
- Disambiguates DD/MM from MM/DD by finding a value whose first part exceeds 12 (which can only be a day).
- Picks the single
strptimepattern that parses the most sample rows, then re-parses every row deterministically.
Column-role detection
- Scores every column for date, amount, debit, credit, balance, description, reference, currency and payee roles.
- Blends content evidence (numeric / date / sign / cardinality ratios) with multilingual header keywords - English plus common German, French, Spanish, Italian, Dutch and Portuguese bank-export labels.
- Works even on header-less files, using the data shape alone.
- Chooses automatically between a single signed-amount layout and a split debit / credit layout.
Reusable templates & import
- Save any detected mapping as a named, per-bank template.
- Review and override the proposed role of each column before saving - every heuristic ratio is shown for full transparency.
- Import a full bank CSV using a template straight into account.bank.statement.line records, ready for reconciliation.
- Confidence score per role and overall, so you know when to trust the proposal and when to check.
What gets detected
| Aspect | Detected values |
|---|---|
| Field delimiter | Comma, semicolon, tab, pipe |
| Header row | Present / absent |
| Number format | Dot-decimal vs comma-decimal, with grouping |
| Date format | ISO, DD/MM, MM/DD, dotted, named-month, 2- or 4-digit year |
| Amount layout | Single signed column or split debit / credit |
| Column roles | Date, amount, debit, credit, balance, description, reference, currency, payee |
How it works
- Upload a sample - a handful of rows of your bank's CSV export.
- Detect columns - the engine proposes the dialect, formats and a role for every column, with a confidence percentage.
- Review - adjust any role inline if you disagree; the numeric, date and distinct ratios behind each guess are shown.
- Save as template - give the mapping a name tied to that bank.
- Import - feed full statement files through the template and the rows land as bank statement lines on the journal you pick.
The detection engine is pure, deterministic Python - no external service is contacted and no data leaves your database. "AI" here means a transparent heuristic scoring model you can inspect, not a black box.
Technical notes
- Builds on the community
accountmodule only - no Enterprise dependency. - Imported lines use the standard
account.bank.statement.linemodel, so they appear in the normal bank reconciliation flow. - Accountancy parentheses
(123.45)and trailing-minus123.45-are both read as negative amounts. - Compatible with Odoo 18 and Odoo 19.
Screenshots
Import Csv
Detection Samples
Mapping Templates
Update date: 2026-07-02