100% local — your data never leaves your browser

YAML to CSV — A Spreadsheet From a List

Turn a YAML list into a spreadsheet. Each mapping becomes a row and its keys become the header, ready for Excel or Google Sheets.

Instant Private Zero cookies
Delimiter

YAML input

CSV output

What this tool does

A YAML sequence of mappings becomes rows:

- name: Ada
  born: 1815
- name: Alan
  born: 1912
name,born
Ada,1815
Alan,1912

The root has to be a list

A table is a list of records. A mapping at the root — the shape of every configuration file — is one record’s worth of data with no list around it, and there is nothing sensible to do with it. If you meant one row, write - in front of it.

Several documents become several rows

name: Ada
---
name: Alan

gives two rows. A ----separated stream is a sequence of records, written the other way round, so it converts like one.

Columns that do not line up

The header is the union of every key seen, in first-seen order. A record missing one gets an empty cell — nothing is dropped for being irregular.

What a cell cannot hold

One value. When a key holds a mapping or a sequence, that subtree is written as JSON inside the cell rather than spread across column names this tool would have to invent. Flatten before converting if you want real columns.

The two settings

Delimiter — a comma by default. A semicolon is what a French, German or Spanish Excel expects, because in those locales the comma is already the decimal separator.

Header row — on by default. Turn it off when the file feeds something that expects data only.

Private by design

Everything runs locally in your browser with JavaScript. Your data is never uploaded, which makes the tool safe for sensitive content, and it keeps working offline.

Frequently asked questions

Why is my mapping refused?
Because a CSV is a list of records and a mapping is one thing, not a list of them. `a: 1` has no rows. Wrap it — `- a: 1` — and you get a one-row table. The refusal is deliberate: guessing that your configuration file is a table would produce a table of nonsense.
What happens to a nested value?
It is written as JSON inside the cell. A cell holds one value and your key holds a subtree; spreading it over invented `parent.child` columns would impose a naming convention nobody agreed to. JSON in a cell is ugly, reversible and honest.
My records do not all have the same keys. Is that a problem?
No. The header is the union of every key seen, in first-seen order, and a record missing one gets an empty cell. An export where only some entries carry an optional field is normal, and dropping either the column or the row would lose data for the sake of tidiness.

Related converters