devtools

CSV to Markdown Table

Convert CSV to a GitHub-flavored Markdown table in your browser: RFC 4180 quoting, custom delimiters, optional header row, and escaped pipes. Free and private.

Runs entirely in your browser — your data never leaves your device.

How to use CSV to Markdown Table

What it does & when you need it

You have a spreadsheet export or a query result, and you want to drop it into a README, a GitHub issue, a pull-request description, or your docs as a clean table. Pasting raw CSV looks awful; hand-formatting a Markdown table is tedious. This converter reads CSV the way the format actually works and emits a GitHub-flavored Markdown table — header row, --- separator, and one row per record — entirely in your browser.

How to use

  1. Paste CSV into the input.csv buffer, press Sample, or Upload a .csv or .tsv file.
  2. Choose the Delimiter that matches your file (comma, semicolon, tab, or pipe) and toggle First row is header depending on whether row one holds column names.
  3. Copy the Markdown from output.md with Copy Markdown or Ctrl/Cmd + Enter and paste it wherever Markdown renders. Want to see it rendered first? Open the Markdown Preview.

Things worth knowing

It respects RFC 4180 quoting. A field wrapped in double quotes may contain the delimiter, escaped quotes, and even newlines. So "Doe, John" stays one cell, and a value that spans two lines is joined with a <br> tag — which GitHub renders as a line break inside the cell rather than shattering the table.

Pipes are escaped for you. The pipe character is the column separator in Markdown, so any pipe inside a cell is rewritten as \|. Without that, a value like a|b would be read as two columns and push every following cell out of alignment.

A table always needs a header. GitHub tables require a header row above the --- separator, so when you turn off the header option the tool generates Column 1, Column 2, and so on. Ragged rows are padded with empty cells to the width of the longest row, and a trailing blank line never becomes a phantom row. For structured output instead of a table, try CSV to JSON.

Examples

Header row to table

name,role,active
Ada Lovelace,admin,true
Grace Hopper,editor,false

The first row becomes the table header and the following rows become aligned data cells.

Quoted commas and newlines

product,note
"Widget, deluxe","ships in
2 days"
Gadget,in stock

The quoted comma stays inside one cell and the embedded newline is rendered as a <br>.

Pipes that need escaping

expression,result
a || b,true
x | y,pipe

Each literal pipe is escaped to \| so the columns stay correctly aligned in Markdown.

Frequently asked questions

Does it handle commas and line breaks inside a cell?

Yes. The parser follows RFC 4180, so a field wrapped in double quotes can contain the delimiter, escaped quotes, and even newlines. A cell value that spans two lines is joined with a <br> tag, which GitHub renders as a line break inside the table cell rather than breaking the table apart.

What happens to a pipe character in my data?

A literal pipe (|) is the column separator in Markdown tables, so any pipe inside a cell is escaped to \| in the output. Without that, a value like "a|b" would be misread as two columns and shift every following cell out of alignment.

What if my CSV has no header row?

Turn off "First row is header" and the tool generates generic headings — Column 1, Column 2, and so on — because a GitHub Markdown table always needs a header row followed by the --- separator. With the option on, your first row is used verbatim as the column titles.

How are rows with different lengths handled?

The column count is taken from the widest row, and shorter rows are padded with empty cells so every row lines up under the same headers. Extra trailing empty lines from a final newline are ignored rather than producing a blank table row.

Can I use a semicolon or tab delimiter, and is my data private?

Yes. Pick a semicolon for European exports where the comma is a decimal separator, or a tab for TSV files. All parsing happens locally in your browser, so a spreadsheet of customer data is never uploaded and the tool works offline.