Spreadsheet exports rarely arrive in the shape your destination wants. A finance CSV needs to become a SQL INSERT script for the staging database; a product catalog has to land as YAML for a Hugo site; a release-notes table belongs in a Markdown pull request. Doing all four conversions usually means opening four different tabs. This tool keeps the source CSV on the left and lets you flip between XML, YAML, SQL, and Markdown on the right without re-pasting anything.
Parsing runs locally through PapaParse, so the CSV stays in your browser. That matters when the file contains customer records, internal pricing, or anything else that has no business going through a third-party server.
How to use
- Pick an output tab — XML, YAML, SQL, or Markdown across the top of the right pane.
- Paste or drop a CSV into the left editor. Headers are detected from the first row; numeric and boolean values are typed automatically.
- Watch the right pane render instantly. Switching tabs reuses the same parsed input, so iterating is fast.
- For SQL, set a table name in the toolbar — the generator emits a CREATE TABLE with inferred column types, then INSERT statements per row.
- Copy or download the result. Outputs are emitted with their canonical extensions (
.xml, .yaml, .sql, .md).
Encoding traps to know about
Roughly half of all CSV bug reports trace back to file encoding. If the output shows ì???, 한글, or mojibake, suspect the encoding before the parser.
- UTF-8 with BOM (
EF BB BF) — the standard Excel "Save as CSV UTF-8" output. PapaParse strips the BOM silently, but some downstream tools (older Java parsers, naive Python open()calls) see it as a literal three-byte first column name. - UTF-16 LE/BE— Windows Notepad's legacy "Unicode" save format. Browsers cannot read it as text — convert to UTF-8 first with
iconv -f UTF-16 -t UTF-8 or open and re-save in VS Code. - EUC-KR / Shift_JIS / Windows-1252 — legacy Asian and European encodings that still show up in exports from older ERPs and Excel for Windows. Same fix: convert to UTF-8 with
iconv before pasting.
Delimiter quick reference
| Delimiter | Common source | Notes |
|---|
, comma | US-locale Excel, RFC 4180 | Default everywhere |
; semicolon | European Excel (DE, FR, ES) | Comma is the decimal separator, so they swap |
\t tab (TSV) | Copy from spreadsheet, log dumps | Safer for free-text fields with commas |
| pipe | Legacy data warehouses | Rare in commas/tabs/quotes |
Conversion target tradeoffs
- SQL — best for repeatable database loads. Watch for type inference: a column that holds
0001234 will be typed as INTEGER and the leading zeros vanish. Wrap leading-zero IDs in quotes inside the CSV so they are inferred as TEXT. - YAML— best for configuration. Remember YAML's type-coercion quirks: a column holding
no, off, or yes will be cast to boolean unless quoted. - XML — best for legacy SOAP/banking pipelines. Header names become tag names; invalid XML characters in headers (spaces, dashes) will break the parser. Rename headers to
snake_case first. - Markdown — best for one-shot documentation. GFM tables do not support multi-line cells, so newlines inside CSV values will collapse to a space.
Frequently asked questions
Does switching output tabs reset my CSV input?
No. The parsed input is shared across all four output tabs, so the right pane re-renders from the same dataset whenever you flip tabs. That is the whole point of the converter — paste once, see four outputs. Edits to the CSV propagate to every target format live.
How does the SQL tab decide column types?
Type inference scans every value in a column and picks the narrowest type that fits: INTEGER if every cell is a whole number, REAL if any cell has a decimal point, BOOLEAN if every cell is true/false, otherwise TEXT. If you need a specific type — for example, TEXT for a leading-zero zip code — wrap those values in quotes inside the CSV so the parser sees them as strings.
My CSV has Korean characters that turn into question marks. What happened?
The file is almost certainly encoded in EUC-KR (or another legacy code page) instead of UTF-8. Browsers read all pasted text as UTF-8, so bytes outside that range become replacement characters before PapaParse even sees them. Re-save the file as UTF-8 in VS Code (or run iconv -f EUC-KR -t UTF-8 in.csv > out.csv) and try again.
Does the converter handle quoted commas and embedded newlines?
Yes — PapaParse implements RFC 4180. A field wrapped in double quotes can contain commas, newlines, and even escaped double quotes (written as two consecutive double quotes inside the field). The parser keeps the contents intact, and every output format escapes the value correctly for its own syntax.
What is the practical file size limit?
There is no hard limit; the ceiling is your browser's memory. Multi-megabyte files (50,000+ rows) convert in under a second on a modern laptop. For files in the hundreds of megabytes, consider streaming with the PapaParse Node library or jq/csvkiton the command line instead — that's outside what a browser tab can comfortably do.
Related guides
JSON vs YAML: When to Use What — A Developer's Guide
JSON wins on APIs; YAML wins on configs. Side-by-side syntax, parser behaviour, and where each fits across Kubernetes manifests, REST payloads, and GitHub Actions.
SQL Formatting Best Practices: Write Clean, Readable Queries
Where to break lines, when to indent JOINs, and how to keep CTEs readable past 30 lines. Style guide comparisons and the rules that hold up across SQL dialects.
Markdown Syntax: A Complete Guide for Developers and Writers
Plain Markdown covers most documentation; GitHub Flavored Markdown adds tables, task lists, and Mermaid diagrams. Syntax reference, gotchas, and the editor picks worth trying.
Docker Compose for Beginners: From docker run to YAML
How to translate a pile of docker run commands into a single docker-compose.yml. Service definitions, named networks, volumes, env files, and the override patterns for dev vs prod.