CSV to Markdown

Turn a CSV or TSV file into a Markdown table. Free, no account. Paste the text or upload .csv, .tsv, or .txt. Delimiter, header row, alignment, and pretty-print run in your browser. The file is not uploaded.

Need to edit cells one by one? Open the Markdown Table Generator. This page does not send the grid there. For a JSON array from an API, use JSON to Markdown.

FileReader reads the .csv or .tsv on this device. WebInk does not receive the spreadsheet. A paste over 5,000,000 characters, or a file over that many bytes, is refused.

Auto checks the first record outside quotes. A tab wins. A semicolon or a pipe wins only when it beats both the comma and the other separator. A tie stays a comma.

Waiting for CSV. Parsing stays in this browser.

Paste CSV or TSV, or upload a file. Copy and Download stay off until there is a table.

Markdown Table Generator · JSON to Markdown · All tools

How to convert CSV to a Markdown table

Three steps on this page. The delimited text stays in this tab. Sample CSV loads the worked example below, with Auto delimiter, the first row as the header, no alignment colons, and pretty-print on.

1

Paste or upload the delimited file

Paste CSV or TSV into the box, or choose a .csv, .tsv, or .txt file. FileReader reads it locally. Copy and Download stay disabled until the parser finds rows.

2

Set delimiter, header, alignment, and pretty-print

Leave Delimiter on Auto, or force comma, semicolon, tab, or pipe. First row is header is on by default. Alignment applies to every column. Pretty-print pads columns so the pipes line up in a monospace editor.

3

Copy, download, or preview the table

The Markdown updates as you edit. Copy it, download a .md file, or open Preview. A paste over 5,000,000 characters is refused. The table stops at 1,000 rows and 100 columns.

What a CSV to Markdown table keeps

People search for “csv to markdown” and “csv to markdown table” when a spreadsheet export has to land in a README, an Obsidian note, or a prompt. A CSV file is rows of fields separated by a delimiter. A GitHub-flavored Markdown table is one line per row, cells split by pipes, and a separator line of dashes under the header. This page runs that conversion locally. It does not call the WebInk fetch API, and it does not ask you to drop the file on a server. Paste the finished table beside a vault note when you want Markdown tables in Obsidian.

Delimiter starts on Auto. The first record is inspected outside of quotes. If that record contains a tab, the file is treated as TSV, which is what Excel and Google Sheets put on the clipboard and what a .tsv download usually is. Otherwise a semicolon is chosen only when it appears more often than both commas and pipes, and a pipe is chosen only when it beats both commas and semicolons. A tie goes to the comma. Force Comma, Semicolon, Tab, or Pipe when the guess is wrong, for example when the header is a single field and the real separator shows up only later, or when you know the export dialect. The parser underneath is the same one the Markdown Table Generator uses for pasted CSV, including quoted fields.

First row is header is on when the page loads, so the first record becomes the Markdown header. Turn it off and every record is a data row. The header is then written as Column 1, Column 2, and so on, which is useful when the export has no labels. Alignment for every column writes the same colon style on the whole separator row. Pretty-print pads cells with spaces so a monospace view lines up. Those spaces do not change how GitHub renders the table. The status line names the delimiter it used and how many rows and columns it kept.

A worked example: quoted CSV in, pipes out

Sample CSV is the block below. The Name field for BK-1 is quoted because it contains a comma. Notes contains a pipe. The second product’s notes contain a real line break inside quotes, and the name is Chinese. With the page’s default options (Auto, header on, alignment none, pretty-print on) the Markdown is exactly the second block. Price stays a text field; CSV has no number type, so 3.5 is not reformatted.

CSV

Sku,Name,Notes,Price
BK-1,"Rye bread, sliced","Fresh | daily",3.5
BK-2,面条,"Line one
Line two",12

Markdown

| Sku  | Name              | Notes                | Price |
| ---- | ----------------- | -------------------- | ----- |
| BK-1 | Rye bread, sliced | Fresh \| daily       | 3.5   |
| BK-2 | 面条                | Line one<br>Line two | 12    |

The pipe in “Fresh | daily” is escaped so the Notes column does not split. The line break in the second notes field is the HTML break tag <br>, which Preview and GitHub both treat as a line break inside the cell. Pretty-print pads shorter cells out to the longest string in the column, which is why the raw pipes sit further apart than a compact table. Turn pretty-print off and the padding goes away. The rendered table does not.

A semicolon export is a different dialect, not a different tool. This three-column file has no commas, so Auto selects the semicolon. The quoted name keeps its semicolon. The Markdown under it is the compact form (pretty-print off) so you can see the cells without padding spaces.

Semicolon CSV

Sku;Name;City
BK-3;"Rye; sliced";台北

Markdown, pretty-print off

| Sku | Name | City |
| --- | --- | --- |
| BK-3 | Rye; sliced | 台北 |

With First row is header turned off, a two-field paste such as alpha,beta then 1,2 becomes this table. Both records are data. The labels are generated.

| Column 1 | Column 2 |
| --- | --- |
| alpha | beta |
| 1 | 2 |

Excel, Google Sheets, and quoting

From Excel, use Save As and pick CSV UTF-8 when you can. That export is usually comma-separated and keeps characters outside Latin-1, including the Chinese name in the example. The older “CSV (Macintosh)” and “CSV (MS-DOS)” choices can recode those characters before this page ever sees them. This tool does not repair a file that Excel already saved in the wrong encoding. If the sheet uses a comma as the decimal separator, Excel often writes semicolons between columns. Upload that file and check the status line: it should say semicolon. If it says comma, switch the delimiter yourself. Google Sheets’ Download as Comma-separated values is a comma file. Download as Tab-separated values, or a direct copy of cells, is TSV. You can paste either one. You do not have to upload a file for a small range.

Quoting is where hand conversion goes wrong. A product name like Rye bread, sliced must be wrapped in double quotes in the CSV or the comma becomes a new column. Excel does that wrap for you on export. If you are assembling CSV in a text editor, wrap any field that contains the delimiter, a quote, or a line break, and type a quote inside a field as two quotes. This page then stores one cell, not two. A field that is only a Markdown separator such as --- is still just text. This converter does not look for an existing pipe table. If you already have Markdown, paste it into the Markdown Table Generator, which can reload a pipe table into a grid.

Ragged rows are padded. If one record has fewer fields than the widest record, the missing cells are empty rather than shifting the rest of the row. Blank lines are dropped. A leading byte-order mark is dropped. The grid that becomes Markdown stops at 1,000 rows and 100 columns, and the status line says so when something was left out. That is a display cap, not a claim that a warehouse extract of a million rows belongs in a README. For a prompt, a few hundred rows of a CSV is already a lot of tokens. After you copy, the Token Counter can measure the Markdown. It uses OpenAI encodings and says so. It does not price the table.

Limits, and how this compares with doing it by hand

Writing pipes by hand is reasonable for three columns and five rows with no reserved characters. It gets brittle as soon as a shop title contains a comma, a note contains a slash that you mistype as a pipe, or one row is short. You then recount every line. This converter keeps the quoting rules and the escaping in one place, and it refuses a paste over 5,000,000 characters instead of freezing the tab on a multi-megabyte dump. Empty input does not produce a fake one-cell table. Copy and Download stay off, and the box tells you it is waiting for CSV.

GitHub-flavored tables have no merged cells and no real multiline cells, so a spreadsheet merge will not survive. Each source cell becomes one Markdown cell, and a newline, carriage return, or Unicode line separator becomes a break tag. There is no formula evaluation: if the CSV contains the text of a formula rather than its cached value, you will see the formula text. Export values if that is what you want in the note. Unicode is preserved, including emoji and non-Latin scripts. The tool does not translate and does not detect a header in a language-specific way. The first row is the header only because the switch says so.

The WebInk Chrome extension is a different job. It converts the page already open in a tab, including an HTML table that is part of that article. It does not import a .csv from disk, and this page does not read a logged-in spreadsheet in the browser. If the table already exists as HTML you copied, use HTML to Markdown. If the finished pipe table needs to become HTML for a CMS or a newsletter, paste the Markdown into Markdown to HTML. Both of those stay in the browser for a paste. The tools hub lists the input each page expects. A JSON payload, including JSON Lines, belongs on JSON to Markdown, not in this delimiter box. JSON pasted here is not detected as a table unless it happens to contain commas in a way the CSV parser can split, which is the wrong tool for nested keys.

JobThis pageBy handTable generator
Excel or Sheets CSV / TSV fileUpload or pasteRetypePaste only, no file picker
Quoted commas and line breaksKept in one cellEasy to split wrongSame parser, then editable
Per-column alignmentOne setting for all columnsBy handYes
Runs in the browserYesYesYes
Add the WebInk extension

The extension clips web pages. It does not open a CSV file.

Frequently asked questions

No. The converter parses the paste or the file you pick with FileReader, then builds the Markdown table in the page. There is no request to /api/markdown and no account. A file bigger than 5 MB (measured in bytes) is refused before it is read. A paste longer than 5,000,000 characters is refused before it is parsed. Copy and Download only move text on your machine.

Related