CSV to Markdown Table
Convert CSV to a GitHub-flavored Markdown table with per-column alignment and a live preview. Auto-detects the delimiter, escapes pipes, and runs in your browser.
- Free, no account
- No watermark
- No usage limit
About the CSV to Markdown Table
Most CSV to Markdown converters give you one alignment for the whole table and call it done. That falls apart the moment your data mixes text and numbers, because a column of prices reads wrong when it sits left-aligned next to a column of names. This one lets you set the alignment of every column on its own. Click Left, Center, or Right on the price column, leave the labels on the left, and the divider row gets the exact colons each column needs. There is also a live preview, so you watch the real rendered table change as you click, instead of pasting the Markdown somewhere else to find out you guessed wrong.
The whole thing runs as you type, with no convert button to hunt for. Paste your CSV, drag a .csv file onto the box, or pick one with the button, and the Markdown table appears in the output straight away. Nothing you paste is uploaded or stored, so an internal spreadsheet or a customer list stays on your machine and is gone the moment you close the tab.
How to use
- Get your CSV into the box. Type it, paste it, drag a
.csv,.tsv, or.txtfile onto the input, or click Choose a CSV file. Cells copied from Excel or Google Sheets paste as tab-separated text, which works fine here. - Check the delimiter. Auto-detect reads your first line and picks comma, semicolon, or tab on its own. If a file lands crammed into one column, set the delimiter by hand.
- Decide on the header. Keep "First row is the header" on when your top row holds column names. Turn it off for raw data, and the tool fills in Column 1, Column 2, and so on.
- Align each column. Once the table parses, a control appears for every column. Push numbers to the right, keep text on the left, center short labels, whatever reads best. Set all changes every column at once.
- Watch the preview. The rendered table below the output shows how the result will look, and it follows every alignment change immediately.
- Copy or download. Grab the Markdown with Copy output, or save it as a
.mdfile. Paste it into GitHub, GitLab, Notion, Obsidian, a docs site, Reddit, or a pull request comment. - Share your setup. The Share button copies a link that reopens the tool with your delimiter, header choice, and per-column alignment already set. For a small table, the data rides along in the link too.
If the input has a problem, almost always a quote that opens and never closes, the output clears and a red message tells you the exact fix.
Set the alignment per column, not per table
Alignment in Markdown is controlled by colons in the divider row, the line of dashes under the header. A colon on the right (---:) pushes a column right. Colons on both ends (:---:) center it. Plain dashes (---) leave it on the left. Getting that right by hand across six columns means counting colons, and a single misplaced one shifts the wrong column.
Here the alignment is a set of buttons, one group per column. A column of dollar amounts snaps to the right so the digits line up under each other and read in order, while names and descriptions stay left and a short status label sits centered. This is the part most free converters skip, and it is the difference between a table that technically renders and one a reader can actually scan. Because CSV carries no formatting of its own, per-column control is the only way to get mixed alignment without hand-editing the output after the fact.
See it before you post it
The live preview renders your table the way a GitHub-flavored viewer will, alignment and all, so you are not reading raw pipes and dashes and picturing the result. It updates the instant you change a setting, which saves the usual round trip of pasting into GitHub, spotting a column that came out wrong, and coming back to fix it. The preview shows the first fifty rows to stay quick on large files, and the copied Markdown always carries every row.
The messy parts of real CSV, handled
CSV looks simple and stops being simple the moment your data gets interesting. A plain split on commas breaks on the first quoted field, so the parser here reads character by character instead.
Quoted values keep their delimiter. A value wrapped in double quotes such as "Smith, John" stays one cell, not two, and a doubled quote inside ("") collapses to a single literal quote.
Then there is the pipe, which is the column separator in Markdown itself. A value like yes|no or a path like stdin | grep would tear your row apart if it went in raw, so every pipe in your data is escaped to \| for you. That single detail is the most common way a hand-built table breaks.
A cell that spans two lines is another trap, because a Markdown row is strictly one line. Any newline inside a cell becomes an HTML <br>, which keeps the break and holds the row together. On a strict renderer that blocks inline HTML you would flatten the cell to one line yourself.
Ragged rows are handled without a fuss. If an export has a row with a value missing or one extra, the table is sized to the widest row and short rows are padded with blanks, so nothing is dropped. Unexpected blank cells usually mean a stray delimiter back in the source.
Where this lands
Data is born in a spreadsheet or a database, documentation lives in Markdown, and this tool is the bridge between the two. It comes up constantly: a feature comparison in a README, a table of API endpoints in a wiki, benchmark numbers in a pull request, a quick grid dropped into Notion or Obsidian notes. GitHub, GitLab, Bitbucket, Docusaurus, MkDocs, VitePress, Reddit, and Discord all read the same GitHub-flavored table, so one conversion travels almost everywhere you would post it.
A Markdown table is a good fit for a small, mostly static grid. If your data runs to hundreds of rows or more than six columns, it stops rendering well on a page, and you are better off linking to the source or using a real data view.
Frequently asked questions
Can different columns have different alignment?
Yes, and that is the main reason to use this over a basic converter. Each column gets its own Left, Center, or Right setting, and the divider row is written with the matching colons per column. You can set a numeric column right and the text columns left in the same table, with no manual editing of the output.
Does the table really update without a convert button?
It does. The Markdown and the preview both rebuild the moment you change the input, the delimiter, the header toggle, or any alignment. Nothing needs clicking to trigger a conversion.
What does the Share link actually save?
The query part of the link holds your delimiter choice, whether the first row is a header, and the alignment of every column. A small table rides along too, but it sits after the #, which browsers never send to a server, so your rows stay out of access logs and out of the referrer header. Bigger tables share the settings only, to keep the link a sensible length. The embed code leaves your rows out either way, because an embed lands in the HTML of a page anyone can read.
Can I load a file instead of pasting?
Drag a .csv, .tsv, or .txt file onto the input box, or use the Choose a CSV file button. You can also paste a file copied from your file manager. Files are read locally up to 5 MB and never leave your device.
My data has no header row. What happens?
Turn off the First row is the header toggle. Every row is then treated as data, and the tool generates generic headers (Column 1, Column 2, and so on) so the table can render, since a GitHub-flavored table cannot exist without a header line.
Why did my whole file end up in one column?
The delimiter does not match your data. Auto-detect handles most files, but for an unusual one set Comma, Semicolon, or Tab by hand. Semicolons show up in exports from regions where the comma is the decimal mark, and cells copied straight from a spreadsheet are almost always tab-separated.
Will the output work outside of GitHub?
For the most part, yes. It is standard GitHub-flavored Markdown, which GitLab, Bitbucket, Docusaurus, MkDocs, VitePress, Obsidian, and Notion all understand. The one thing to watch is the <br> used for in-cell line breaks, which needs a viewer that allows inline HTML.
Is there a cap on rows or columns?
There is no hard cap on what it will convert. The live preview shows the first fifty rows to stay responsive on big files, but the copied or downloaded Markdown always includes every row.