Built on advanced on-device AI and hardware acceleration to deliver professional-grade performance with uncompromising privacy.On-device AI — professional-grade, fully private.
Convert CSV to Markdown
CSV to Markdown tables with per-column alignment
- Nothing uploaded
- Per-column alignment
- Padded or compact
- Copy or .md
Drop a CSV here
One file up to 25.0 MB · .csv .tsv .txt .psv
Detected by parsing a sample with each candidate and keeping the most consistent reading.
A quote only opens a field in first position, so an apostrophe inside a word stays an apostrophe.
A byte-order mark overrides this — the file stating its own encoding beats a guess.
The default for every column. Override one from the dropdown in its preview header.
A table row is one line, so a break inside a cell has to become something else.
Bold applies to the body — a header row is already bold when rendered.
For exports that carry a title and a date above the real header.
0 keeps every row.
Used for a single file, the merged document and the archive. .md is added for you.
Writes every queued file into one Markdown file, each table under a heading from its filename.
Free: one file up to 25.0 MB, every formatting option included.
How to convert a CSV into a Markdown table
- 1
Drop the CSV in
Drag a .csv, .tsv, .txt or .psv file onto the page, or browse for it. The delimiter, quote character and encoding are read from the file itself, and the tool says which it chose.
- 2
Check the rendered preview
The preview shows the table as it will render, not just the raw text — so you can see straight away whether a cell containing an asterisk or a line break is going to behave.
- 3
Set alignment and formatting
Choose an alignment for the whole table or per column from the preview header. Turn on padded output for readable raw text, escaping for cells containing Markdown characters, numbered rows, or a bold first row or column.
- 4
Copy or download
Press Convert, then Copy to put the table on the clipboard for a README or a pull request, or download it as a .md file with the name you choose. Everything runs on your device.
What this CSV to Markdown tool offers
Convert CSV to a GitHub-Flavored Markdown table, with the two things that decide whether the result is usable: correct escaping, and control over how each column lines up. Use the first row as the header or generate column labels, set alignment for the table or per column, pad the output or keep it compact, and preview the rendered table beside the raw Markdown before you copy it.
- Markdown table format — GitHub-Flavored Markdown: a header row, a separator row carrying the alignment, then one row per record. It renders in GitHub, GitLab, Obsidian, Notion, VS Code, Jira and Confluence without changes.
- Per-column alignment — Set a default for the table, then override any single column from the dropdown in its preview header. Left, center, right, or none.
- First row as header — Use the first CSV row as the table header, or turn it off to treat every row as data with generated Col 1, Col 2 labels.
- Escaping that holds up — Pipes and backslashes are always escaped, line breaks inside a cell become <br>, and asterisks, underscores, backticks, brackets, angle brackets and tildes can be escaped too.
- Padded or compact — Pad every column so the raw file lines up in a text editor, or keep it compact so a regenerated table produces the smallest possible diff.
- Rendered preview and raw view — See the table as it will render and the Markdown as it will be written, and switch between them. Every setting changes at least one of the two.
- Copy or download — Put the table straight on the clipboard for a README or a pull request, or download it as a .md file with a name you choose.
What a Markdown table actually is
A Markdown table is three kinds of line, and knowing which is which explains every option on this page. The tool writes all three for you, but the shape is worth understanding because it is what decides where a table breaks.
The header and the separator
- Header row — One line of cells between pipes. It is always bold when rendered, which is why bolding it again does nothing and why this tool's bold options apply to the body instead.
- Separator row — The line of dashes directly beneath the header. It is not decoration — its presence is what makes the block a table at all, and the colons in it are the only way to set alignment.
- Body rows — One line per record. A row with fewer cells than the header is padded out; a row with more would be truncated by most renderers, so ragged files are squared to the widest row instead.
The two things that break a table
- An unescaped pipe — A pipe inside a cell ends that cell early, so the row gains a column and the renderer either shifts the data or drops it. This tool escapes every pipe, always — it is not an option because there is no case where the raw character is what you meant.
- A line break inside a cell — A Markdown table row is one line. A quoted CSV field containing a newline — a postal address, a comment — would end the row in the middle and every row after it falls out of the table. See the line-breaks section below for the three ways this tool handles it.
Column alignment, per column
Alignment lives in the separator row, as colons. This tool writes it for you, and it can differ per column — which is what you want the moment a table mixes labels with numbers.
- Left — :--- — The default, and right for names, labels and free text. A colon on the left of the dashes.
- Center — :---: — Colons on both sides. Useful for short status columns and single-character marks where centring reads better than a ragged left edge.
- Right — ---: — A colon on the right. This is the one that matters for numbers: right-aligned figures line up on the decimal point, so a column of prices or counts can be compared by eye.
- None — --- — No colons at all. The renderer uses its own default, which is left in every renderer we know of, and the separator row stays as short as possible.
- Per column — Each column's preview header carries its own dropdown. Set the table default once, then override the two numeric columns to Right — a table of names and figures reads correctly with about four clicks.
Escaping, line breaks and special characters
Text arriving from a spreadsheet has no idea it is about to become Markdown, and several perfectly ordinary characters mean something once it does. The tool splits these into what it always fixes and what you choose.
Always escaped
- Pipes — Written as \| . An unescaped pipe ends the cell, which shifts or loses data — there is no version of that anyone wants, so it is not a switch.
- Backslashes — Doubled to \\ , and done first so that the backslashes every other rule adds are not doubled in turn. A Windows path in a cell survives intact.
Your choice
- Markdown characters — Asterisks, underscores, backticks, brackets, angle brackets and tildes. A cell reading *note* renders as italic with the asterisks gone; escaped, it reads as *note*. Off by default, because most tables contain none of these and the backslashes are visible in the raw file.
- Line breaks: <br> — The default. A break inside a cell becomes an HTML line break, which every Markdown renderer that supports tables also supports, so a multi-line address stays one cell and stays readable.
- Line breaks: \n — A literal backslash-n. Right when the table is going somewhere that strips HTML, and when it matters that a break was there without it being rendered as one.
- Line breaks: space — The break becomes a single space. The shortest output, and the right choice when the breaks are an artefact of the export rather than meaning.
- What is not escaped — Hyphens, full stops and plus signs are left alone. Escaping them is technically valid and turns every date into 2026\-01\-01 and every price into 12\.50, which no renderer needs and no reader wants.
Reading the CSV: delimiter, quotes and encoding
Half of what makes a converted table wrong happens before any Markdown is written. These three settings decide what the rows even are, and all three are detected from the file with an override beside them.
- Delimiter — Comma, semicolon, tab or pipe, detected by parsing a sample with each and keeping the one that produces the most consistent row widths. Counting separators on the first line — the common shortcut — reads "a,b,c,d";"e";"f" as comma-separated and collapses every row into one column.
- Quote character — Double quote, apostrophe, or none, detected the same way. A quote only opens a field in first position, so an apostrophe in O'Brien stays an apostrophe instead of swallowing the rest of the row.
- Encoding — Auto by default: the byte-order mark wins when the file has one, otherwise the bytes are tested for valid UTF-8 and fall back to Windows-1252. Force UTF-8, UTF-16LE, UTF-16BE, Windows-1252 or ISO-8859-1 when a file carries no mark and guesses wrong.
- ISO-8859-1 is not Windows-1252 — The web platform treats the first as a label for the second, so most tools offer both and give you one. Here ISO-8859-1 really is byte-for-code-point Latin-1, which matters for files where 0x80 to 0x9F are control codes rather than curly quotes.
- Byte-order marks — Excel's CSV UTF-8 export writes one, and a tool that does not strip it puts an invisible character at the front of your first column heading. It is removed, and if it contradicts the encoding you picked the tool says so rather than silently overruling you.
Padded or compact output
Both produce the same rendered table. The difference is what the raw file looks like, and which one you want depends entirely on who reads it that way.
- Padded — Every cell is padded so the pipes line up in a column. The raw Markdown is readable as a table in any plain text editor, which is what you want when someone will open the .md file rather than a rendered page.
- Compact — One space either side of each cell, nothing more. The output is smaller and — more usefully — a value changing in one row does not re-pad every other row, so a regenerated table checked into git produces a one-line diff instead of a whole-file one.
- Padding follows alignment — A right-aligned column pads on the left, a centred one pads both sides. So the raw text lines up the same way the rendered table will, which is the point of padding it at all.
- Numbered rows — Adds a leading column counting the body rows from one. Useful for referring to a row in a review comment, and it is not part of your data — it is regenerated whenever the table is.
- Bold first row or column — Wraps the first body row, or the first column of every body row, in double asterisks. The header row is already bold when rendered, so these deliberately apply to the body — bolding the header again would be a control that does nothing.
A 25 MB export — about 225,000 rows — converts in around a second on a desktop, in a background thread, so the page never freezes.
Skipping, limiting and trimming
Real exports are rarely just a header and rows. Four controls deal with the parts that should not become table cells.
- Skip leading rows — Drops rows from the top before anything else happens. Reports and dashboard exports commonly carry a title, a date and a blank line above the real header; skip those and row one becomes the header it should have been.
- Limit rows — Caps how many body rows are written. A README wants the first twenty rows of a large export, not all forty thousand — and the preview shows exactly what will be produced.
- Remove empty rows — Drops any row where every cell is blank. Spreadsheet exports collect these at the bottom, and each one becomes a row of empty cells in the table.
- Remove empty columns — Drops any column with no data in it. When a header row is in use, the heading alone does not keep the column — an unused column with a name is exactly the case this control exists for, and its heading goes with it.
Several files at once
One file converts on the free tier with every formatting control available. Converting many at once is what the Pro plan adds, and it comes in two shapes because the two are genuinely different jobs.
- A batch of files — Queue up to fifty CSVs, convert them in one action, and take them away as a single ZIP. Duplicate filenames are made unique inside the archive rather than overwriting each other.
- One merged document — The same queue written into a single Markdown file, each table under a heading taken from its filename. This is the shape you want for a documentation page that has to show four related tables in one place.
- Settings apply to the queue — Alignment, padding, escaping and the rest apply to every file in the batch, so a set of exports comes out consistent. Per-column alignment stays per file, because the columns differ.
- Everything still on your device — A batch is the same engine run more times. Nothing is uploaded, the queue is bounded by your own memory rather than by a server, and the size ceiling on the Pro plan is what your device can handle.
Where Markdown tables work
The table this tool writes is GitHub-Flavored Markdown, which is the dialect nearly everything has settled on. A few destinations have quirks worth knowing before you paste.
- GitHub and GitLab — READMEs, issues, pull request descriptions and wikis. Alignment colons are honoured, and <br> inside a cell renders as a line break.
- Obsidian and VS Code — Both render tables in preview and both read the raw file constantly, which is the case padded output is for.
- Notion — Pasting a Markdown table creates a real Notion table. Alignment is not carried across, so the colons do no harm but do nothing either.
- Jira and Confluence — Modern Jira converts a pasted Markdown table. Older Confluence markup uses its own table syntax, so paste into a Markdown macro rather than the page body.
- Static site generators — Jekyll, Hugo, Docusaurus, MkDocs and Astro all render GFM tables in content files. Compact output keeps the source diffs small when a table is regenerated from data.
Why convert CSV to Markdown?
Markdown tables are used in READMEs, docs, and static sites. Converting CSV to Markdown lets you embed tabular data in Markdown-based content, and keeps it in the same version control as the code it documents.
- Docs and READMEs — Drop tables into documentation without typing a single pipe, and without a screenshot that goes stale the moment the numbers change.
- Portable text — Markdown keeps data readable in repos, wikis, and static generators — and readable as plain text when nothing renders it at all.
- Reviewable in a diff — A table stored as text shows what changed line by line in a pull request. A spreadsheet attached to the same commit shows nothing.
- No dependency to install — The result is text. It needs no plugin, no extension and no runtime wherever it lands, which is not true of an embedded sheet or a chart image.
Options at a glance
- Delimiter — Auto-detect by consistency, or choose comma, semicolon, tab or pipe.
- Quote character — Auto-detect, double quote, apostrophe, or none.
- Encoding — Auto with byte-order-mark detection, UTF-8, UTF-16LE, UTF-16BE, Windows-1252 or a true ISO-8859-1.
- First row as header — When on, row one is the table header; when off, every row is data and Col 1, Col 2 labels are generated.
- Alignment — Left, center, right or none for the table, overridable per column from the preview header.
- Padded output — Line the columns up in the raw file, or keep it compact for smaller diffs.
- Escape Markdown characters — Escape asterisks, underscores, backticks, brackets, angle brackets and tildes as well as the pipes and backslashes that are always escaped.
- Line breaks in a cell — Turn a break into <br>, a literal \n, or a space.
- Numbered rows, bold row, bold column — A counting column, a bold first body row, and a bold first column — independently.
- Skip, limit and trim — Drop leading rows, cap the row count, and remove rows and columns that hold nothing.
- Download as — Custom filename for the .md file; the extension is added if you leave it off.
Frequently asked questions
How does the CSV to Markdown converter work?
Drop a CSV and the tool reads its delimiter, quote character and encoding from the file, parses it, and builds a GitHub-Flavored Markdown table: a header row, a separator row carrying the alignment, and one row per record. Pipes and backslashes in cells are escaped automatically, and line breaks inside a quoted cell become <br> so the table does not fall apart. You see the table rendered and the raw Markdown side by side, then copy it or download a .md file.
Is my CSV data private and secure?
Yes. The file is read and converted on your device and is never uploaded, stored or transmitted anywhere. That is also why there is no queue and no wait: the work happens in a background thread on your own machine, so a 25 MB export of about 225,000 rows converts in around a second on a desktop and nothing about it leaves the page.
Which delimiters and file encodings are supported?
Commas, semicolons, tabs and pipes, with the quote character detected as well — a file quoted with apostrophes reads correctly, and a delimiter sitting inside a quoted field is ignored rather than counted. Encoding is auto-detected from the byte-order mark when there is one, covering UTF-8, UTF-16LE and UTF-16BE; you can also force UTF-8, Windows-1252 or ISO-8859-1 by hand for exports that carry no mark. Excel's own CSV UTF-8 export is handled, including its byte-order mark.
Can I control headers and column alignment?
Yes, and alignment can be set per column rather than only for the whole table. Keep First row as header on to use row one as the table header, or turn it off to treat every row as data with generated Col 1, Col 2 labels. Set a default alignment for the table, then override any individual column from the dropdown in that column's preview header — the separator row is written as :--- , :---: or ---: accordingly, which is what GitHub, GitLab and Obsidian read to align the column.
What happens to a cell containing a pipe, an asterisk or a line break?
A pipe would end the cell early, so it is always escaped as \|, and a backslash is always doubled. A line break inside a quoted cell would break the table apart, so it becomes <br> by default — you can also choose a literal \n or a single space. Asterisks, underscores, backticks, brackets, angle brackets and tildes render as formatting rather than text, so there is a switch to escape those too; it is off by default because most tables do not need it and the backslashes are visible in the raw file.
Is it free, and does it work offline and on mobile?
The tool is free with no watermark, and there is no row limit — files up to 25 MB convert on the free tier, which is more than double what the closest comparable tools allow. Because everything runs locally it works on phones and tablets, and it keeps working offline once the page has loaded. A Pro plan adds batch conversion of many files at once, delivered as one ZIP or merged into a single Markdown document.
When should I convert CSV to a Markdown table?
Whenever tabular data has to live inside text: README files, GitHub and GitLab wikis, pull-request descriptions, static-site documentation, Obsidian and Notion notes, Jira and Confluence pages. Padded output is worth turning on when the Markdown will be read as plain text in a diff or an editor; compact output keeps the diff small when the file is checked into a repository and regenerated often.
from 71 ratings
Rate this tool
Tap a star — it takes a second