Convert a Markdown table to a list

Paste a Markdown table and get a list back. Three output shapes: one row per line (cells joined), first column only, or every cell flattened into its own line. Accepts both classic GFM tables (`| col | col |`, pipe on every edge) and no-outer-pipe style (`col | col`). The separator row (`|---|---|`, `---|---`, with or without `:` alignment markers) is auto-detected and skipped.

Input
Ready
Output
Live

A Markdown table parser

The parser walks line by line and keeps any line containing a `|` that splits into at least 2 cells. Both Markdown styles work: leading-pipe GFM (`| col | col |`) and no-outer-pipe (`col | col`). The separator row - dashes, colons, pipes, and spaces only (`|---|---|`, `---|---`, `|:---:|---:|`) - is detected by regex and discarded automatically. Everything else is split on `|`, outer pipes stripped, and each cell trimmed.

Output mode shapes what you get. Rows (default) joins every row's cells with the Row join string (defaults to ` | `), one line per row. First column pulls only the leftmost cell from each row - useful when the first column is an ID or name. Cells flattens every cell into its own output line, losing row structure but good for a total value inventory.

Skip header (off by default) drops the first data row after the separator strip - turn it on when the first row is a header you do not want as data. Trim + Dedupe run as the standard post-processing. The min-2-cells guard means a prose line with a single stray `|` does not get swept in as a fake table row, but prose with multiple pipes (rare) can still slip through - strip surrounding prose first for best results.

How to use convert a markdown table to a list

  1. 1Paste your Markdown table into the input panel
  2. 2Pick Output mode: Rows (default), First column only, or Flatten every cell
  3. 3Set Row join to change the separator used when joining cells (default ` | `)
  4. 4Toggle Skip header to drop the first data row if it is a header
  5. 5Toggle Trim + Dedupe for standard post-processing

Keyboard shortcuts

Drive ListShift without touching the mouse.

Shortcut Action
Ctrl ZUndo last input change
Ctrl Shift ZRedo
Ctrl Shift EnterToggle fullscreen focus on the editor
EscExit fullscreen
Ctrl KOpen the command palette to jump to any tool
Ctrl SSave current pipeline draft Plus
Ctrl PRun a saved pipeline Plus

What this parser actually does

Three output modes, automatic separator-row handling.

Pipe-based row detection, both table styles

A line is treated as a table row if it contains `|` and splits into at least 2 cells. That handles leading-pipe GFM (`| col | col |`) AND no-outer-pipe style (`col | col`) in one pass. Headings, blank lines, and surrounding prose are dropped because they have no pipe or only one cell.

Automatic separator-row detection

The divider row - composed only of dashes, colons, pipes, and whitespace (`|---|---|`, `---|---`, `|:---:|---:|`) - is matched by regex (`^[\s:|-]+$`) and dropped automatically. You do not have to manually strip it. All three alignment variants (left, right, center) are recognised.

Three output modes

Rows joins each row's cells with your Row join string (one line per row). First column pulls only column 0 (useful for IDs or names). Cells flattens every cell into its own output line, producing N items per row.

Skip header for data-only output

After the separator row is dropped, the next row is your header. Skip header drops that too, so the output is pure data. Off by default because users often want the header row as the first item.

Trim + Dedupe post-processing

Cells are individually trimmed during parsing. The Trim toggle controls trimming on the final joined items; Dedupe drops duplicates case-insensitively after everything else.

Worked example

Default output: three data rows, each joined with ` | `. Header row kept (Skip header = off).

Input
| Name | Age |
|------|-----|
| Alice | 30 |
| Bob   | 25 |
| Carol | 42 |
Output
Name | Age
Alice | 30
Bob | 25
Carol | 42

Settings reference

How each option shapes the parsed list using the sample above.

Setting What it does Effect on the sample
Output: Rows (default) Each row's cells joined with the Row join string Four lines, one per row (header + 3 data)
Output: First column only Only column 0 from each row emitted `Name`, `Alice`, `Bob`, `Carol`
Output: Flatten every cell Every cell becomes its own line Eight lines: `Name`, `Age`, `Alice`, `30`, `Bob`, `25`, `Carol`, `42`
Row join: `, ` (comma-space) Alternate Rows-mode separator `Name, Age` / `Alice, 30` / ...
Skip header: on Drops the first data row after the separator Header `Name | Age` removed from output
Separator row (automatic) `|---|---|` or `---|---` divider detected and dropped Never appears in the output regardless of table style

FAQ

Does the tool skip the separator row automatically?
Yes. Any line composed only of dashes, colons, pipes, and whitespace is treated as a separator and dropped before the data rows are collected - works with or without outer pipes (`|---|---|` and `---|---` both qualify) and with all three alignment variants (`:---`, `---:`, `:---:`).
Does the parser require leading pipes on every row?
No. Both table styles are accepted: leading-pipe GFM (`| col | col |`) and no-outer-pipe (`col | col`). As long as each row contains at least one `|` and splits into 2+ cells, it is treated as a table row. Headings, blank lines, and prose without a pipe are dropped.
How is First column only different from Flatten every cell?
First column extracts index 0 from each row - one item per row, the leftmost value. Flatten emits every cell as its own line - N items per row, loses row structure. Pick First column when the first column is the identity (ID, name); pick Flatten when you want a complete value inventory.
What happens to my table's header row?
It is treated as the first data row by default. Toggle Skip header on to drop it - useful when you want the data only, not the column labels.
What happens to cells with pipes in them?
Pipes inside cells break the parser because the split is done on `|` with no escaping. Markdown tables do not have a universal escape convention for pipes either. If your cells contain pipes, pre-process with Replace to swap them for something else before parsing.