How to split a transactions csv into one file per account
- Step 1Export the full transactions CSV — Pull the ledger or transaction list from your accounting system: Xero Account Transactions export, QuickBooks transaction report → Export to CSV, Sage nominal activity export, or a bank-statement CSV. Make sure the Account / Nominal / Cost Centre column is present and keep the header. Free tier: 2 MB / 500 rows; Pro: 100 MB / 100,000 rows.
- Step 2Drop the file onto the splitter above — PapaParse parses it locally — amounts and counterparties never leave the tab. The first row becomes the headers and fills the Split by column dropdown.
- Step 3Select the Account or Cost Centre column — Choose
Account,Nominal Code,Cost Centre, or whichever column carries the account value. The dropdown lists every header by name (blank headers show asCol N). One column per run. - Step 4Decide on case-sensitive grouping — Case-sensitive grouping (default ON) keeps alphanumeric codes like
4000-Aand4000-aseparate. For pure numeric nominal codes case makes no difference, so the default is safe; untick only if you deliberately want to fold case variants. It never trims whitespace, so4000stays its own group. - Step 5Run the split and reconcile the account list — Click Split into groups. The result panel shows Total rows and Groups (the distinct account count), then each account with its transaction count. Reconcile against your chart of accounts — an extra group usually means a trailing space, a code-format variant, or an uncoded
(empty)bucket. - Step 6Download each account's file — Each account has its own Download button — files save individually (no ZIP/bulk download). The filename is
<ledger-name>.<account>.csv, with the account value sanitised to letters/digits/hyphen/underscore (other characters become_) and truncated to 50 characters.
The two controls the splitter exposes
Two inputs only — a single-column selector and a case toggle. No code normalisation, no merge, no multi-column split, no delimiter picker. The tool never re-formats numbers.
| Control | What it does for a transactions file | Default |
|---|---|---|
| Split by column (dropdown) | Selects the single account column — Account, Nominal Code, Cost Centre. Lists every header by name; blank headers show Col N | First column (index 0) |
| Case-sensitive grouping (checkbox) | ON: 4000-A and 4000-a are separate files (no effect on pure-numeric codes). OFF: case variants merge (key lowercased), named after the first-seen spelling. Never trims whitespace | On (ticked) |
How account-code values group
The split groups on the raw account cell as text — codes are never coerced to numbers, so leading zeros and formatting are preserved.
| Account cells | Case-sensitive (default) | Note |
|---|---|---|
4000, 4000, 5000 | 2 files: 4000 (2), 5000 (1) | Clean numeric codes |
00400, 400 | 2 files — text grouping keeps them distinct | Leading zeros preserved, not collapsed |
4000, 4000 (trailing space) | 2 files — space makes a distinct group | No trimming |
4000-A, 4000-a | 2 files (untick case-sensitivity → 1) | Alphanumeric cost-centre suffix |
5000, `` (uncoded) | 2 files: 5000 (1), (empty) (1) | Uncoded entries grouped |
Free vs Pro limits for transaction splits
Limits apply to the source ledger before the split. Output file count is uncapped — one per distinct account.
| Limit | Free | Pro |
|---|---|---|
| Source file size | 2 MB | 100 MB |
| Source row count | 500 rows | 100,000 rows |
| Output account files | No cap | No cap |
Cookbook
Before/after splits from ledger and bank exports. Amounts illustrative; counterparties anonymised.
Xero account transactions split by Nominal Code
ExampleEach account is reconciled separately. Selecting Account produces one file per nominal code, header included.
Input (transactions.csv): Date,Description,Account,Amount 2026-01-03,Office rent,7100,1200.00 2026-01-05,Stripe payout,4000,842.10 2026-01-09,Utilities,7100,210.40 Split by column: Account Groups (2): 7100 — 2 rows → transactions.7100.csv 4000 — 1 row → transactions.4000.csv transactions.7100.csv: Date,Description,Account,Amount 2026-01-03,Office rent,7100,1200.00 2026-01-09,Utilities,7100,210.40
Leading-zero nominal codes preserved
ExampleSage-style nominal codes with leading zeros stay intact because grouping is text-based — 00400 and 400 are different accounts and each gets its own file.
Account cells: 00400, 00400, 400 Split by Account → 2 groups: 00400 — 2 rows → transactions.00400.csv 400 — 1 row → transactions.400.csv The code is never parsed as a number, so 00400 is not flattened to 400 and the two stay separate.
Uncoded transactions land in the (empty) file
ExampleEntries with no account allocated group under (empty) so the bookkeeper can code them before period close.
Account cells: 4000, (blank), 7100, (blank) Split by Account → 3 groups: 4000 — 1 row → transactions.4000.csv 7100 — 1 row → transactions.7100.csv (empty) — 2 rows → transactions._empty_.csv ← uncoded
Cost-centre code with a colon sanitises in the filename
ExampleThe on-screen group keeps the exact code; the download filename sanitises characters like : and spaces.
Group value on screen: CC-100: Marketing Download filename: transactions.CC-100__Marketing.csv Rule: [^a-zA-Z0-9-_] → '_', first 50 chars. The CSV cells keep the real cost-centre value; only the filename is sanitised.
Account then period: a two-pass workflow
ExampleThe tool splits by one column per run. For account-then-period, split by account first, then narrow each account file by date with the row limiter or column filter.
Pass 1 — split transactions.csv by Account → transactions.4000.csv, transactions.7100.csv Pass 2 — narrow transactions.7100.csv to one period: use csv-column-filter (/tool/csv-column-filter) on the Date column (greater-than / contains), or csv-row-limiter (/tool/csv-row-splitter) for a fixed row window. To pull just one account, csv-column-filter does it in one step.
Errors and edge cases
Real errors and silent failures sourced from each platform's own documentation. Match the wording to the row, fix what the row says to fix.
Uncoded transactions (blank account)
PreservedRows with an empty account cell are grouped into one file shown as (empty). They are never dropped — treat it as the suspense/uncoded list to allocate before period close. Code them in the source and re-run, or hand the (empty) file to the bookkeeper.
Leading-zero nominal codes
PreservedGrouping is text-based — the splitter never coerces codes to numbers, so 00400 keeps its leading zeros and is a different group from 400. (If your source CSV already lost the zeros to Excel auto-formatting before you uploaded it, re-export the account column as text from your accounting system.)
Trailing spaces on account codes
PreservedThe splitter never trims. 4000 and 4000 (trailing space) are always separate groups, even with case-sensitivity off — only the comparison key is lowercased, never trimmed. Trim the account column first with the csv-cleaner to keep one account in one file.
Confidentiality between account owners
By designEach output file contains only the transactions for that account value — no other account is present. This is a cleaner, more secure hand-off than a shared spreadsheet with hidden rows, which a recipient can unhide to see the whole ledger.
Amounts with currency symbols or thousands separators
SupportedThe splitter is text-only and never touches the Amount column — values like £1,200.00 or (842.10) pass through unchanged in every output. It groups on the account column only; amount formatting is irrelevant to the split (and preserved exactly).
Ledger over the free 2 MB / 500-row limit
Rejected (free tier)A full-period transaction export usually exceeds 500 rows, blocking the run on free with an upgrade overlay. Pro raises the ceiling to 100 MB / 100,000 rows. The check is on the source ledger, not the per-account outputs.
Quoted commas in a description column
SupportedPapaParse is RFC-4180 quote-aware, so a Description like "Invoice 123, deposit" is one cell and won't shift the account column. Grouping is on parsed cells, so embedded commas in descriptions don't affect the split.
Cost-centre codes sharing their first 50 characters
Filename collision riskFilenames truncate to 50 sanitised characters. Standard account codes are well within that, but long descriptive cost-centre labels that share a 50-character prefix produce the same filename — rename on save. The CSV contents remain correct and complete.
Frequently asked questions
Can I split by both account and period?
Not in one pass — the tool partitions by a single column. Split by account first, then narrow each account file to the period you need with the csv-column-filter tool on the Date column (greater-than / contains conditions), or use the csv-row-splitter for a fixed row window. The value splitter handles the account dimension; the period is a follow-up step.
Does this work for nominal ledger account codes?
Yes. Any column with categorical values works, including numeric and alphanumeric nominal codes. Crucially, grouping is text-based, so codes are never coerced to numbers — leading-zero codes like 00400 are preserved and stay distinct from 400.
Is financial data uploaded?
No. PapaParse runs entirely in your browser; amounts, descriptions, counterparties, and account codes never reach a server. Only an anonymous run counter is recorded server-side when you are signed in — never the transaction content. This is appropriate for sensitive ledger data.
Will leading zeros on my nominal codes be lost?
No — the splitter is text-only and never converts codes to numbers, so 00400 keeps its zeros in both the grouping and the output cells. If the zeros are already missing in your file, that happened upstream (typically Excel reading the code as a number). Re-export the account column as text from your accounting system, then split.
Why is one account showing up in two files?
Usually a trailing space (4000 vs 4000 ) or an alphanumeric case variant (4000-A vs 4000-a). The splitter never trims, so whitespace always fragments a group; clean it first with the csv-cleaner. Case variants merge if you untick Case-sensitive grouping.
Does each account file include the header?
Yes. Every output begins with the ledger's original header row, then only that account's transactions. The file imports into a reconciliation workbook or opens in Excel with full column context.
Does it download all account files in one ZIP?
No. Each account has its own Download button and saves a single CSV. There is no bulk or ZIP download — manageable for a chart of accounts with a handful of active codes, click-heavy for a large one. Filter to the accounts you need first if necessary.
Are amounts or descriptions changed by the split?
No. The splitter only partitions rows — it never edits any cell. Amounts with currency symbols, thousands separators, or parentheses for negatives all pass through unchanged. Only the download filename is sanitised; the data is untouched.
What happens to uncoded transactions?
Transactions with a blank account are grouped into a single file shown as (empty). Nothing is dropped — use it as your suspense/uncoded list to allocate before period close, then re-run if you want them in their proper account files.
How large a ledger can it handle?
Free tier: 2 MB / 500 rows. Pro: 100 MB / 100,000 rows. The limit is on the source ledger. A full-year transaction export typically needs Pro, or pre-chunk it with the csv-row-splitter (which splits by row count, not by account).
I only need one account for an auditor — should I use this?
If you want every account as its own file, yes. If you only need a single account or cost centre, the csv-column-filter tool extracts that one slice in a single step (equals condition on the account column) without generating files for every other account.
Can I automate the account split at month end?
Yes — GET /api/v1/tools/csv-column-value-splitter returns the option schema (columnIndex, caseSensitive). Pair the @jadapps/runner once and POST your ledger to 127.0.0.1:9789/v1/tools/csv-column-value-splitter/run. A typical pipeline: month-end accounting export → runner-side split by Account → drop each file to the responsible accountant's folder. Financial data never reaches JAD's servers — the runner runs locally.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.