Data Table Workbench | CSV and JSON to Markdown

ConverterRuns in Your Browser (No Uploads)

Convert bounded CSV rows or JSON object arrays into escaped GFM tables locally. Detect delimiters, preview the table, preserve nested JSON as compact text, and review warnings for uneven rows, generated headers, multiline cells, and number precision.

What to do next

Continue with a related workflow or open the next tool that usually follows this task.

How to Use This Tool

Choose CSV or JSON based on the source structure. Remove secrets, tokens, private customer fields, and unrelated columns before placing a representative sample in the workbench.

For CSV, select automatic detection or an explicit comma, tab, semicolon, pipe, or one-character custom delimiter. Confirm whether the first non-empty row is truly a header.

Choose no alignment, left, center, or right alignment. This applies one GFM separator style to every generated column and does not infer numeric meaning.

Convert the input and compare the reported row, column, input-byte, and output-byte counts with the source. Stop if quote, shape, precision, or resource-limit errors appear.

Read every warning for skipped blank rows, uneven records, generated or duplicate headers, nested JSON, nulls, multiline cells, edge spaces, and encoded HTML-shaped text.

Inspect the safe visual preview, then copy or download the Markdown and test it with the real destination renderer, link checker, mobile layout, and review workflow before publishing.

When to Use This Tool

Turn a spreadsheet export into a README table

Paste a reviewed spreadsheet export, verify quoted commas and uneven rows, then publish a compact compatibility or release matrix in a README.

Document a representative API response

Convert a small array of API example objects while preserving false, zero, null, and later-added keys for a documentation page.

Convert operational exports into runbook evidence

Use tab or semicolon detection for regional exports, review the detected delimiter, and produce a table for a support runbook without opening a desktop spreadsheet app.

Review a small schema migration fixture

Compare generated row and column counts with a migration fixture and attach the Markdown diff to a code review or data-contract change.

Prepare a sanitized incident table

Create a safe, readable incident appendix from scrubbed records, keeping HTML-shaped values inert and verifying the final renderer before sharing.

Common Mistakes

Treating CSV as simple comma-separated lines

A comma may appear inside a quoted field, and a quoted field may contain a real line break. Splitting text on commas or lines corrupts those records. Use the CSV mode and resolve every quote error before trusting the row count.

Promoting the first data row to a header

A GFM table always needs a header and separator row. When the source has no header, clear the first-row option so the workbench creates neutral Column 1 labels instead of silently promoting the first record.

Assuming every JSON number is exact in JavaScript

JSON numbers beyond the safe browser integer range or decimals that round during parsing can change identifiers and measurements. The workbench rejects these values; represent exact identifiers as JSON strings or fix the source contract.

Using compact nested JSON as a finished data model

Object and array values are serialized into compact JSON inside one cell. That preserves evidence but does not flatten relational structure. Redesign nested records or choose specific fields when readers need sortable atomic columns.

Publishing without the destination renderer

The built-in preview confirms this conversion, not every destination. GitHub, a documentation generator, a wiki, and an email renderer can differ on raw HTML, line breaks, column width, and mobile overflow. Test the copied table where it will be published.

Examples

Convert quoted CSV with a literal pipe

The comma inside the quoted name remains one cell, and the pipe is escaped so it cannot create an extra Markdown column.

Input
Name,Role\n"Lovelace, Ada",Engineer | Writer
Output
A two-column GFM table with Lovelace, Ada in one cell and Engineer \| Writer in the Role cell

Detect a semicolon-delimited export

Automatic detection chooses semicolon from a consistent sample and reports the actual delimiter in the conversion details.

Input
Name;Team\nGrace;Compiler\nKatherine;Flight Research
Output
A two-column table whose first row is used as Name and Team headers

Normalize an uneven CSV row

A short third record is padded with an empty cell, while the uneven-row warning remains visible for review.

Input
Name,Team,Location\nAda,Math,London\nGrace,Compiler
Output
A three-column table with an empty Location cell for Grace and a ragged-row warning

Union keys from uneven JSON objects

Keys are collected in first-seen order across all objects, so a property introduced by a later record still receives a column.

Input
[{"name":"Ada","active":true},{"name":"Grace","score":0}]
Output
A table with name, active, and score columns; missing values are empty while false and zero remain visible

Preserve nested values as compact JSON

Nested objects and arrays are not replaced with vague placeholders. They become compact JSON text and trigger a review notice.

Input
[{"project":"Docs","owner":{"team":"Web"},"tags":["gfm","qa"]}]
Output
A row containing compact owner and tags JSON in their respective cells

Keep HTML-shaped input inert in the generated table

Potential markup is encoded as table text. The output does not emit an active img element, but the destination still needs its normal Markdown security policy.

Input
[{"note":"<img src=x onerror=alert(1)>"}]
Output
A note cell containing &lt;img ... &gt; as visible text rather than active HTML

Strict parsing, exact bounds, one escaping contract, and local preview

CSV mode loads Papa Parse only when a CSV conversion runs. It handles quoted delimiters, doubled quotes, embedded newlines, CRLF, and delimiter detection. The workbench strips one leading byte-order mark, removes fully blank rows, rejects quote errors, measures the widest row, and pads missing trailing cells while retaining a ragged-row warning.

JSON mode uses the repository's strict JSON parser with comments and trailing commas disabled. The root must be an array of objects. Duplicate object keys are rejected before one value can overwrite another, and lexical number checks reject unsafe integers or decimals that JavaScript would round. Property order follows the first appearance of each key across records.

Every result uses one Markdown renderer. Backslashes and pipes are escaped, source newlines become generated <br> markers, leading and trailing spaces use non-breaking entities, and HTML-significant source characters are encoded. This keeps user text from becoming an active HTML element in the generated table while preserving a readable rendered value.

Bounds are enforced after both raw-input and parsed-shape measurement: 262,144 Unicode code points, 524,288 UTF-8 bytes, 5,000 rows, 100 columns, 200,000 normalized cells, 32,768 characters per cell, and 5,000,000 output bytes. Character limits and byte limits are separate so multibyte text is measured honestly.

The browser preview renders headers and cells as React text, not injected HTML. Normal conversion makes no application request with source or output. Consent-aware analytics receives only the parent slug, mode, option names, duration, byte counts, aggregate dimensions, and diagnostic totals; it does not receive delimiters supplied as data, field names, values, or Markdown.

Frequently Asked Questions

Are my CSV or JSON cell values uploaded?

No. Conversion runs in the browser. The selected mode, safe option names, byte counts, row and column counts, duration, and aggregate warning counts may be measured after consent, but source cells and generated Markdown are not included in analytics events.

How does CSV parsing differ from splitting on commas?

CSV mode uses Papa Parse for quoted fields, escaped quotes, detected or selected delimiters, and line endings. It rejects malformed quote records, removes a leading BOM, skips fully blank rows, and reports uneven rows before padding missing cells.

Which JSON shape is accepted?

The JSON root must be a non-empty array and every item must be an object. Keys are unioned in first-seen order. Nested arrays and objects become compact JSON text; null becomes an empty cell. Duplicate keys and numbers that would lose precision are rejected.

What changes are made to Markdown cell text?

Pipe characters and backslashes are escaped, source line breaks become generated <br> markers, edge spaces are represented with non-breaking entities, and HTML-significant source text is encoded. These rules protect the column structure, but destination-specific Markdown behavior still needs review.

What are the processing limits?

One run accepts at most 262,144 Unicode code points, 524,288 UTF-8 bytes, 5,000 parsed rows, 100 columns, 200,000 normalized cells, and 32,768 characters in one cell. Generated Markdown is capped at 5,000,000 UTF-8 bytes.

How should I verify a table before publishing it?

Compare the row and column counts, scan the warning list, inspect the visual preview, copy or download the .md file, and render it with the exact GitHub, wiki, static-site, or documentation engine that will publish it. Check narrow screens and long unbroken values there.

How This Tool Was Verified

Maintained and tested by Reviewed

Method: For “Document an API fixture that contains a late key, a zero, and a nested owner”, we entered the documented fixture in Data Table Workbench and followed “Confirm whether the source contract is CSV or JSON” before “Resolve every parser, shape, and precision finding”. We compared the browser result with the stated output, then reviewed “Using production data as a convenient sample” and “Trusting delimiter detection without checking the export settings” as separate failure boundaries.

Expected result: The GFM table kept first-seen column order, represented the nested owner as compact JSON, preserved false and zero, and left the missing score cell empty rather than dropping the row.

Open the tested workflow

Related workflow guides

Use these focused guides when you need a practical workflow before opening the tool.

Related Tools

Continue with another maintained workflow

Browse All Tools