JSONL Splitter / Merger
100% client-side. No upload.
Split
JSONL Splitter / Merger
Split an oversized JSONL into smaller files (by line count or N equal chunks) or concatenate a folder full of JSONL files into one. Useful when your file is too big for a target system or scattered across exports.
Merge
Splitting strategies
By line count
Produces a sequence of files, each containing exactly the chosen number of lines (the last file may have fewer). Use this when the downstream system has a hard line limit per file — for example, OpenAI fine-tune jobs accept files up to a fixed size, and most data warehouses prefer load files in the 100k-line range to keep individual loads fast.
Into N chunks
Splits the input as evenly as possible across N output files. Use this when you're parallelizing work — say, sending each chunk to a different worker — and you want the files to all be roughly the same size rather than ending with a tiny tail file.
Merging
The merge mode is a streaming concat: each file's lines are appended in queue order with
exactly one \n between records. Empty lines are skipped (per the JSONL spec
— see the JSONL Validator for why blanks cause issues), and you
can optionally drop byte-identical duplicate lines as the merge runs. For richer dedupe
(canonical compare or key-path), pipe the output through the JSONL
Deduplicator.
Tips & common pitfalls
- Browser memory matters. Splitting a 2 GB file means holding the whole thing in memory plus N output blobs. Close other tabs first, or fall back to a CLI for true gigabyte-scale workloads.
- Filenames are predictable. Outputs are named
part-001.jsonl,part-002.jsonl, etc., zero-padded so they sort correctly in any file manager. - Each chunk is fully valid JSONL on its own. Lines aren't broken across chunks, so you can validate each piece independently.
- Merge order matters. Files are concatenated in the order you dropped them. For deterministic ordering across machines, name your inputs lexically.
Example
Input (10 records), split by line count at 4:
part-001.jsonl— lines 1-4part-002.jsonl— lines 5-8part-003.jsonl— lines 9-10
Same input split into 3 chunks:
part-001.jsonl— lines 1-4part-002.jsonl— lines 5-8part-003.jsonl— lines 9-10
(Same shape in this case; the split-by-N math chooses ceiling-per-chunk to keep file count exact.)
Frequently asked questions
Is the split lossy?
No. The full input round-trips: concatenating all output files (in order) reproduces the input exactly, modulo blank-line handling.
Why don't downloads start automatically?
Browsers throttle programmatic downloads — chaining a hundred of them in a loop typically gets blocked. Instead the tool gives you a list of links and you click them as you need. If you need a single archive, do the merge in reverse with another tool.
Can it preserve a header line across splits?
JSONL has no header concept (unlike CSV), so no. If your file is actually CSV-flavoured JSON-Lines with a leading metadata record, you'll need to handle that record manually after splitting.
Is my data sent to a server?
Never. Splitting and merging both happen in-browser via Blob URLs. See the privacy policy.