Toolvore

CSV to Markdown Table

Turn CSV data into a formatted Markdown table.

This tool runs entirely in your browser. Your data is never uploaded, never stored, and never leaves your device.

Converts CSV into a Markdown table, treating the first row as the header, escaping the characters that would otherwise break the table, and showing a rendered preview beside the source.

How to use it

  1. 1Paste your CSV into the CSV Input box.
  2. 2Choose Left, Center or Right in Column alignment — this sets the dashes in the separator row.
  3. 3Copy the Markdown Output, or check the Preview table underneath first.

Example

Input
name,role "Smith, Jane",Engineer
Output
| name | role | | :--- | :--- | | Smith, Jane | Engineer |

The quoted comma stays inside one cell. Rows shorter than the widest row are padded with empty cells rather than shifting the columns along, a literal pipe in your data is escaped to \| so it cannot split a cell, and a newline inside a quoted field becomes <br>.

What happens to your data

Parsing is done by a small character-by-character reader written into the page — it tracks whether it is inside quotes, treats a doubled quote as a literal one, and handles both CRLF and LF endings — so no CSV library is fetched and no data is posted for parsing. There is no file upload here at all, only a textarea, and the parsed rows exist as a memoised value that is thrown away and rebuilt on the next keystroke.

Last updated August 2026

A table that lives in a spreadsheet has to become something else the moment it goes into a README, a pull request description, a GitHub issue or a wiki page. Those places take Markdown, which wants pipes and dashes rather than commas. Paste the raw rows in and a renderer collapses them into one grey paragraph.

Check your delimiter before anything else. The comma is the only field separator here — there is no setting for semicolons or tabs — and a spreadsheet in a locale that uses the comma as a decimal mark will export a file called .csv with semicolons throughout. Open the text and look at it first.

Then settle what a Markdown table can hold, because it is far less than a sheet. Every table has one header row and one alignment marker per column, and that is the model: no merged cells, no spanning, no row groups, no footer, no formulas, no colour. Whatever a cell holds has to fit on a single line.

The mistake that catches people is the first line. It becomes the column headings, whatever it is, so an export that opens with a report title or a date stamp gives you a table headed by that line and your real field names sitting in the body as data. Trim the file back to headings and rows first.

How it works

Toolvore reads the text one character at a time rather than splitting on commas: a comma inside a quoted field is a character, and a comma outside one ends a cell. A doubled quote inside a quoted field becomes one literal quote, a line holding nothing but whitespace is dropped rather than becoming an empty row, and input with nothing usable in it produces the message 'No data found in the CSV input' rather than a half-built table. The preview underneath is drawn from the parsed rows rather than from the finished text. The weak points cluster. There is no delimiter option, so anything not comma-separated arrives as one tall column. A quote mark never meant as a delimiter — an inch sign, a nickname mid-field — flips the reader into quoted mode and vanishes from the result. A space typed after a comma stays part of the next cell. And the output pipes are not padded to equal widths, so the raw Markdown looks ragged even though it renders straight.

Common use cases

  • Putting a spreadsheet extract into a README
  • Turning an exported query result into a table for a pull request
  • Dropping a pricing or comparison table into a GitHub issue
  • Right-aligning a table of figures so the numbers read properly
  • Checking in the preview how a messy export was parsed
  • Moving a small dataset into a Markdown-based static site
  • Converting a lookup table into documentation kept under version control

Frequently asked questions

How do you make a table in Markdown?

A row is cells wrapped in pipe characters, like | name | role |. Under the header goes a separator row with one cell per column, each holding at least three dashes. Everything after is a body row. Header and separator are both compulsory — without them it is not a table, and a renderer prints your pipes as literal text. Column widths in the raw text need not match; renderers ignore the spacing. That is the whole syntax, which is why hand-writing suits four rows and not forty, and why the separator is the line people forget.

Why is my Markdown table not rendering?

Tables are not part of original Markdown. They arrived as an extension, most familiarly in GitHub Flavored Markdown, so support depends on whatever renders your text, not on the file. GitHub, GitLab, Obsidian, most static-site generators and documentation platforms handle them; a plain Markdown library with extensions off, some comment boxes and some note apps do not. If your pipes appear on screen as pipes, the renderer is the reason and no change to the table will help. Check first that the separator row is present with one cell per column — the cheaper explanation.

Why is my CSV file separated by semicolons instead of commas?

Because the file was written on a machine whose regional settings use the comma as a decimal mark. Excel and several other spreadsheet applications follow the operating system's list separator when they export, so across much of Europe a file named .csv is semicolon-delimited and entirely legitimate. Nothing detects that here — the comma is the only field separator, so a semicolon file arrives as one tall column with the semicolons still inside the cells. Replace them with commas in a text editor first, or export again choosing the CSV UTF-8 option.

Can a Markdown table cell contain a list, a link or an image?

Inline things work and block things do not. A link, an inline image, bold, italics and inline code survive inside a cell, since none needs a line of its own — only the pipe and the line break are altered, so everything else passes through as typed. A bulleted list, a heading, a fenced code block and a blockquote each begins on its own line, and a table row ends at the newline — none fits in a cell. Where a cell needs two lines, a br tag is the workaround, though a renderer with HTML off prints the tag.

Is it safe to paste work data into an online CSV converter?

Nothing is sent anywhere. There is no file picker and no upload step — you paste into a text box — and the conversion is ordinary string work done by the page already in your browser, so no request carries your rows anywhere and no server holds them. What you paste lives in the page's memory while the tab is open, and goes when you close it. Check that before putting a customer list or an unreleased price sheet into any converter, because plenty of them post the file to a server.

How do I export a table from Excel or Google Sheets as CSV?

In Excel, use Save As or Export and choose CSV UTF-8, which handles accented characters that the plain CSV option can mangle. In Google Sheets it is File, then Download, then Comma-separated values; only the sheet you are on comes out. Copying cells straight to the clipboard does not give CSV at all — it gives tab-separated text, which will not split here. And a file saved by Excel often begins with an invisible byte order mark, which if it survives the paste sits at the front of your first heading.

Why did the quotation marks disappear from my text?

CSV uses the double quote to mean the field is not finished yet, which is how a comma or a line break can live inside a cell. The parser here follows that rule strictly, so a quote used for anything else confuses it: an inch sign, a nickname in the middle of an unquoted field, a quoted phrase inside a sentence. Each flips it into continue-the-field mode and the marks themselves are consumed, so the text arrives with its quotes missing and, where the count is odd, with the cells after it absorbed into one.

How do I align one column differently from the others?

The separator row is where alignment lives: a colon left of the dashes for left, colons both sides for centre, a colon on the right for right. The control here writes the same marker into every column, which covers the common cases — a table of figures set right, a short table centred — but not a mixed table. For that, convert using whichever alignment suits most columns, then edit the separator line in the output by hand and move the colons on the ones you want different. It is one line.

Used in these workflows