About Bank statement parser
Bank statement parser turns a bank statement PDF into a clean CSV of transactions with Date, Description, Amount and Balance columns, dated in sortable ISO format. It reads the statement's text layer, rebuilds each printed line from the positioned runs pdf.js reports, then keeps the lines that carry both a date and an amount, stitching back descriptions that wrap onto the next line. Templates for Chase, Bank of America, HSBC and Barclays are detected from the first page, with a generic parser behind them. Use it to prepare a year of statements for bookkeeping, reconcile against accounting software, build a spending analysis, or hand a lender a machine-readable history. Searches like bank statement PDF to CSV, convert bank statement to Excel, or statement to spreadsheet describe this tool.
Bank statement parser specs
| Price | Free ($0) — no paid tier |
|---|---|
| Account | Not required |
| Watermark | None |
| Where it runs | In your browser, on your device |
| File upload | No file is uploaded |
| Input | PDF (1 file) |
| Output | CSV |
| File size limit | Limited only by your device's memory |
| Works offline after the page loads | Yes |
How to use Bank statement parser
Add the statement
Drop one statement onto "Drop your bank statement PDF here or click to browse". Every page is read and grouped into lines, and parsing then runs immediately.
Confirm the bank template
The Bank template chips are Auto, Chase, Bank of America, HSBC, Barclays and Generic. Auto shows what it recognised from the first page — "Auto · Barclays" — and you can override it when the detection is wrong.
Check the date format
The Date format chips are Auto, DD/MM/YYYY and MM/DD/YYYY. Auto shows which order it settled on; switch it manually when a statement full of ambiguous dates like 05/06 has been read the wrong way round.
Fill the optional fields
Currency override appends a code such as USD or EUR to every amount in the CSV. Statement year supplies a four-digit year for rows printed without one, such as 05/31.
Read the warnings
An amber "Check these before importing" box lists what the parser had to assume: rows that borrowed a year, dates that could be read both ways, and dated rows that had no amount and were skipped.
Download .csv
Review the transaction table — debits in red, credits in green, with the running total in the header — then press Download .csv to save name-transactions.csv.
Frequently asked questions about Bank statement parser
My bank is not in the template list — will it still work?
A statement from an unlisted bank usually parses fine, because the four named templates share the same underlying line parser and the generic fallback is what actually does the work for everything else. The pattern it looks for is a line that begins with a date, followed by a description, followed by one or two amounts — the second being the running balance. That layout is close to universal in retail banking, whichever institution printed the statement. Leave the chip on Auto: it falls back to Generic when no signature matches, and the preview footer tells you whether the template was auto-detected, manual, or a fallback. Where it does break down is a statement laid out as widely separated columns, or one with debit and credit in separate columns.
The dates came out wrong — 05/06 became 5 June instead of 6 May.
Ambiguous dates are resolved from evidence across the whole document, and only when there is none does the tool guess. Any date in the statement with a day above 12 proves the order for every other date, and that inference overrides the bank template when the two disagree. When a statement contains nothing but ambiguous days, the warning box says so and tells you which way they were read. Fix it with the Date format chips: pick DD/MM/YYYY or MM/DD/YYYY and the whole table re-parses instantly, so you see the corrected dates before exporting. The CSV always writes ISO YYYY-MM-DD regardless of what the statement printed, which is what makes the column sort correctly in a spreadsheet.
Some rows have no year on them — what year do they get?
Rows printed as 05/31 with no year take their year from the statement itself. The parser collects every full date anywhere in the document, discards outliers more than a year away from the most common one — a card expiry or a "customer since" line must not stretch the period — and uses the end of that span. If the document contains no full date at all, it falls back to the current year and warns you loudly that it assumed one. The Statement year field overrides all of that: type a four-digit year and every yearless row uses it. Always read the amber box before importing into accounting software, because a wrong year on a December or January statement is painful to unpick later.
How does it decide what is a debit and what is a credit?
Sign is taken from how the amount is printed, and the common conventions are all recognised. Parentheses around a figure, a leading or trailing minus, and a DR or DB suffix all produce a negative amount, while a CR suffix produces a positive one. Currency symbols and codes attached to the figure are stripped before parsing, and both decimal conventions are handled — whichever of the comma or the period comes last is treated as the decimal separator, so 1.234,56 and 1,234.56 both read correctly. What the tool cannot infer is a statement with separate debit and credit columns and no sign at all: those amounts come through positive, so you will need to negate the debits after import. The preview colours negatives red, which makes this obvious.
Transactions are missing from the table — where did they go?
A line only becomes a transaction when it has a recognisable date, a description and at least one amount. Descriptions that wrap onto following lines are stitched back together, but only across a few continuation lines, so a very long merchant description broken over many lines can be abandoned. Summary and page furniture are skipped on purpose: totals, opening and closing balances, brought and carried forward lines, statement periods, account and sort code lines, page numbers and column headers are all filtered out so they cannot masquerade as transactions. The warning box counts any dated row that had no amount beside it. If whole sections are missing, try a different template — and remember a scanned statement yields nothing at all.
Is my bank statement uploaded anywhere?
Your statement is never uploaded, which is the entire reason this tool lives in a browser rather than on a server. The PDF is opened by pdf.js inside the page, the text is read and parsed there, and papaparse assembles the CSV locally before the download fires — no account number, balance, merchant name or filename is transmitted, and there is no endpoint that could receive one. Nothing is stored between sessions either: press Reset or close the tab and the parsed transactions are gone. The tool is free with no signup, and the CSV contains only the four columns and your own rows. Scanned statements are the one case it cannot handle, since there is no text to read — run OCR PDF first.
Why in-browser processing matters
Every PDFChamp tool runs inside this page: the file you choose is read by JavaScript in your own browser and is never sent to a server, so nothing is uploaded, queued, or stored anywhere. That removes the upload wait, the processing queue, and the question of what happens to your file afterwards — the about page compares this architecture with server-side PDF tools.
Last updated