Text Joiner
Text Joiner solves the "two lists that need to be merged row by row" problem: names in one column and URLs in another to build Markdown links; a column of IDs to build a SQL IN (...); several columns of tabular data to reassemble into CSV. Row-by-row alignment plus template placeholders — configure once, produce the whole batch.
It is the inverse of Text Splitter, and pairs well with the batch prefix/suffix in Text Toolbox — that one only adds fixed affixes to a single column, whereas cross-column joining needs this tool.

- Fill in the columns on the left: one text per column, one entry per line
- Click a preset (CSV / Markdown link / SQL IN …) or write your own row template like
{1},{2} - The result updates live on the right — copy it
Column input
- Column count: 1 to 8, adjust as needed
- Auto-split on spreadsheet paste: multi-column content copied from Excel or Google Sheets can be pasted into any column box and is split by tabs across the columns ("Split as table: N rows × M columns"). Content beyond the column limit fills the first 8 and reports the overflow. Turn off the "Auto-split spreadsheet paste" switch if you'd rather it didn't
- Row counts: each column header shows its current row count, making mismatches easy to spot
- Load example: one click drops in runnable sample data
Row template
The template decides what each row produces, referencing the current row of each column with {1}, {2}:
Column numbers you haven't defined are left as-is rather than replaced with empty strings. Clicking the {N} chip next to a column header inserts that placeholder at the cursor.
Built-in presets
One click fills in all four settings — template, separator, prefix, suffix:
- CSV / Quoted CSV / TSV: rebuild tabular data
- Markdown list / Markdown link:
- {1} {2}/- [{1}]({2}) - JSON array: one object per row (
{"c1": "…", "c2": "…"}), wrapped in[ ]and joined with, - SQL IN: emits
IN ('a', 'b', 'c') - SQL VALUES: emits a full
INSERT INTO table (col1, col2) VALUES ('…', '…'), …;
Presets are generated from the current column count — set it to 3 and the CSV preset becomes {1},{2},{3}.
Assembly
The structure is prefix · row ⟨separator⟩ row · suffix:
- Line separator: what goes between rows — a newline
\nby default; SQL IN uses, - Overall prefix / suffix: what wraps the entire result, e.g.
[\nand\n]for a JSON array
Separators and affixes accept escapes like \n and \t. The template itself is not escape-parsed, so type a real tab if you need one.
Row handling
- When columns differ in length:
- Pad (default): follow the longest column, filling missing cells with empty strings
- Truncate: follow the shortest column, dropping the extra rows
- Skip fully empty rows (on by default): a row where every column is empty produces no output
My templates
Configurations you've tuned can be saved and reused:
- Save as / Update current / Delete: manage several named configurations
- Export / Import config: a JSON file containing all templates plus the current settings, for moving between machines or sharing with teammates
Common patterns
- Two columns into CSV: names in one, values in the other → CSV preset
- URL list into Markdown: titles in one, links in the other → Markdown link preset
- ID list into SQL: one column of IDs → SQL IN preset, paste straight into a query
- Spreadsheet data into a database: copy multiple columns from Excel → auto-split → SQL VALUES preset → complete INSERT
- Single-column batch formatting: set the column count to 1 with a template like
{1} — done
Everything runs locally in your browser — nothing is uploaded.

