Split a large CSV into smaller files

Upload forms that cap at 10,000 rows or 25 MB, mail-merge tools that choke past 5,000 contacts, ticketing systems that want batches, a colleague who genuinely just needs “the file, but in Excel-sized pieces” — splitting a CSV is one of those chores that shouldn’t require installing anything. Set a rows-per-file number here and download one ZIP containing the parts: data-part-01.csv, data-part-02.csv, … each with the header row repeated on top so every part imports standalone.

The split is quote-aware — a row whose quoted field contains line breaks is never cut in half, because the splitter counts parsed rows, not text lines. And it happens on your machine: a 300 MB customer file gets split without a byte of it leaving your device.

Preset: the split export panel opens as soon as your file loads.

Drop a CSV, TSV or Excel file here

.csv · .tsv · .txt · .csv.gz · .xlsx — files up to 4 GB open here, in your browser. Nothing is uploaded; the file is read in place on your device.

Paste rows

Paste CSV text or cells copied from Excel / Google Sheets (they paste as tab-separated).

How it works

  1. Drop the file (up to 512 MB for splitting).
  2. The split panel is open — set rows per file (e.g. 9,999 for a 10k-limit importer: headers count!).
  3. Optionally filter first — the split covers exactly the rows in view.
  4. Download the ZIP; each part is a complete CSV with the header included.

Picking the rows-per-file number

Work backwards from the destination’s limit, and mind the header: an importer that accepts “10,000 rows” usually means 10,000 lines including the header, so 9,999 data rows per part is the safe setting. For size-capped uploads (25 MB, say), estimate bytes per row from the status bar (file size ÷ row count) and set rows-per-file with ~10% headroom — CSV rows vary in width, and a part that lands exactly on the cap will bounce on the one fat row.

If the real goal is “make it open in Excel”, the number is 1,048,575 data rows — but consider whether each part will be miserable to use at that size; 100,000-row parts are far more workable, and the part count barely matters once it’s a ZIP.

Good to know

Frequently asked questions

Does every part get the header row?

Yes — each part is a standalone CSV with the header on line 1, which is what upload forms and importers expect. (A future no-header option would only matter for concatenation workflows — tell us if you need it.)

Can a quoted multi-line row get cut between parts?

No — splitting counts parsed rows, not lines, so a row is always kept whole regardless of embedded line breaks. Naive line-based splitters (split by every N lines) do break such rows; that’s the failure this page exists to avoid.

Why one ZIP instead of separate downloads?

Twenty parts means twenty browser download prompts — a ZIP is one click and keeps the parts together. The ZIP is assembled locally (stored, not re-compressed, so it’s fast even for hundreds of MB).

Can I split by file size instead of row count?

Not directly — row count is the honest unit for CSVs since importer limits are usually row-based. For a size target, divide: desired part size ÷ (file size ÷ total rows) ≈ rows per file, minus ~10% headroom.