How to import csv files as markdown tables
- Step 1Locate the source CSVs — Gather the CSV files (or CSV attachments) you are migrating from the old system — one per intended wiki/doc page.
- Step 2Open the converter — Load CSV to Markdown Table. On Free, process one CSV at a time; on Pro you can batch up to 10 files.
- Step 3Set the header option per file — Leave First row is header on for normal exports. For a headerless legacy dump, uncheck it so the tool generates
Col 1,Col 2… labels. - Step 4Convert each file — Run the conversion. PapaParse parses the legacy CSV (auto-detecting the delimiter) and builds the pipe table with pipes escaped and in-cell newlines flattened.
- Step 5Validate the migrated table — Spot-check rows that previously held commas, quotes, or pipes. Confirm the column count matches the source so no column shifted during the import.
- Step 6Drop into the target page — Paste the table into the destination
.mdfile, or save the<name>-table.mddownload into the page's folder, then commit to the wiki/site repo.
Migration targets and the table they need
Where the converted GFM pipe table lands during a content migration.
| Target system | Renders GFM pipe tables? | Migration note |
|---|---|---|
| GitHub / GitLab wiki | Yes | Native GFM; paste the table into the page source and commit. |
| Docusaurus / MkDocs / Astro | Yes | All render GFM tables; save <name>-table.md into the docs tree. |
| Obsidian vault | Yes | Renders GFM tables in preview; one table per note works cleanly. |
| Confluence (Markdown import) | Partial | Confluence's Markdown import understands pipe tables but may re-style them on import — verify after import. |
| Strict CommonMark site (no GFM) | No | Pipe tables are a GFM extension; a non-GFM renderer shows raw pipes. Confirm your generator enables GFM. |
Per-file behaviour during migration
Single-file mechanics relevant to a folder-per-page migration.
| Aspect | Behaviour |
|---|---|
| Files per run (Free) | 1 — convert one CSV at a time. |
| Files per run (Pro) | Up to 10 — batch ceiling for the markdown family. |
| Output filename | <name>-table.md (the source name with .csv replaced by -table.md). |
| Output type | Markdown text — a GFM pipe table. |
| Header decision | Per file, via the First row is header checkbox. |
Cookbook
Legacy CSV imports converted to clean Markdown tables for a wiki/static-site migration.
A straightforward content table migrated
A reference table from an old spreadsheet becomes a committable wiki table.
Input (legacy CSV): Term,Definition API,Application Programming Interface SLA,Service Level Agreement Output (commit into the wiki page): | Term | Definition | | --- | --- | | API | Application Programming Interface | | SLA | Service Level Agreement |
Legacy export with escaped double-quotes
Old exports escape an internal quote by doubling it (""). PapaParse decodes it back to a single quote.
Input (legacy CSV): id,quote 1,"She said ""hello"" twice" Output (Markdown): | id | quote | | --- | --- | | 1 | She said "hello" twice |
Stray pipe in a legacy data cell
Pipe-delimited legacy fragments inside a comma CSV are escaped so they do not shift columns in the migrated table.
Input (legacy CSV): code,path NAV,Home|Settings|About Output (Markdown): | code | path | | --- | --- | | NAV | Home\|Settings\|About |
Multi-line note migrated to one cell
A wrapped note from the old system, quoted in the CSV, collapses to a single line.
Input (legacy CSV): page,notes faq,"Draft. Needs review before publish." Output (Markdown): | page | notes | | --- | --- | | faq | Draft. Needs review before publish. |
Headerless legacy dump
An old data dump with no header row. Uncheck First row is header so every line is data and columns are numbered.
Input (legacy CSV), First row is header = OFF: row-1,active,2021 row-2,archived,2019 Output (Markdown): | Col 1 | Col 2 | Col 3 | | --- | --- | --- | | row-1 | active | 2021 | | row-2 | archived | 2019 |
Edge cases and what actually happens
Batching many CSVs on the free tier
Free limit: 1 fileThe markdown family caps Free at 1 file per run. To convert 10 files in one go you need Pro (batch of 10). On Free, convert them one at a time — the output filename keeps each one distinct.
Legacy delimiter is tab or semicolon
Auto-detectedThere is no delimiter setting; PapaParse sniffs the delimiter, so tab- and semicolon-delimited legacy files usually import correctly. If a tiny file is mis-detected, re-save it as comma-separated.
Unbalanced quotes in a corrupt legacy row
Parse failure riskA row with an opening quote and no closing quote can make PapaParse swallow subsequent rows into one cell. Inspect any suspiciously long cell; fix the quoting in the source CSV and re-convert.
Mixed line endings (CRLF vs LF)
HandledPapaParse handles both \r\n and \n line endings, common when legacy data crosses platforms. No setting is needed.
Target renderer is strict CommonMark
No table renderingPipe tables are a GFM extension. If the destination static-site generator runs strict CommonMark without the GFM table plugin, the migrated table shows as raw pipes. Enable GFM in the generator config.
Ragged legacy rows
Padded / truncatedRows shorter than the header are padded with empty cells; rows longer are truncated to header width. A row that lost data usually had an unescaped delimiter in the legacy export — check the source.
Duplicate headers carried over from the old system
PreservedThe tool does not de-duplicate header names. Two columns named Title migrate verbatim — rename one in the source if the target wiki is strict about unique headers.
Very large legacy export
Tier limitA bulk export can exceed Free's 1 MB / 500,000-character cap. Pro raises it to 10 MB / 5,000,000 characters / 10 files, Developer to 500 MB with no character cap.
Frequently asked questions
What about Excel-specific formatting from the old system?
CSV exports carry data only, never cell formatting, colours, or formulas. Re-style the Markdown table in the target system after migrating if presentation matters.
Can I batch many CSVs at once?
Free is one file per run. Pro raises the batch ceiling to 10 files; Pro-media to 50. For larger automated migrations, the runner-backed API runs the same engine locally.
Will the header row be auto-detected?
The first row is treated as the header by default. If a legacy dump has no header, uncheck First row is header and the tool labels columns Col 1, Col 2 … up to the widest row.
Does it handle escaped quotes from legacy exports?
Yes. PapaParse follows RFC 4180, so a doubled quote ("") inside a quoted field decodes back to a single literal quote in the table.
What happens to stray pipe characters in old data?
Each | in a cell is escaped to \|, so pipe-delimited fragments inside a comma CSV do not shift columns when the table is rendered.
Will multi-line notes migrate correctly?
A quoted multi-line note stays one cell, with its internal line breaks folded to single spaces — the only way to keep it valid in a single-line Markdown table cell.
What is the output file named?
<name>-table.md — the source filename with .csv replaced by -table.md. That keeps each converted file distinct in a folder-per-page migration.
Does my data go to a server during migration?
No. PapaParse runs in your browser, so business data being migrated never leaves your machine.
My target site renders raw pipes instead of a table — why?
Pipe tables are a GFM extension. A strict CommonMark renderer shows the raw syntax. Enable GFM (or the tables plugin) in your static-site generator's config.
A row looks like it lost a column after import — what happened?
An unescaped delimiter in the legacy export probably split a cell or shifted columns. The column count is fixed by the header; fix the quoting in the source CSV and re-convert.
How large a legacy export can I convert?
Free allows 1 MB / 500,000 characters in one file; Pro 10 MB / 5,000,000 / 10 files; Pro-media 50 MB / 20,000,000; Developer 500 MB with no character cap.
Can I automate a bulk CSV-to-Markdown migration?
Yes. GET /api/v1/tools/csv-to-md-table returns the schema (the hasHeader option), and execution is runner-backed: pair the @jadapps/runner and it runs the same engine locally so files never touch JAD servers. To stitch many migrated pages into one document afterward, Markdown Merger combines them.
Privacy first
All Markdown processing runs locally in your browser using JavaScript. No file is ever uploaded to JAD Apps servers — only metadata counters are saved for signed-in dashboard stats.