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
Paste CSV into the input.csv buffer, press Sample, or Upload a
.csv or .tsv file.
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.
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.