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.
| Job | This page | By hand | Table generator |
|---|---|---|---|
| Excel or Sheets CSV / TSV file | Upload or paste | Retype | Paste only, no file picker |
| Quoted commas and line breaks | Kept in one cell | Easy to split wrong | Same parser, then editable |
| Per-column alignment | One setting for all columns | By hand | Yes |
| Runs in the browser | Yes | Yes | Yes |
The extension clips web pages. It does not open a CSV file.