Schema drift shows up as empty columns
Events gain fields over time. Records written before a field existed get an empty cell for it, which is accurate rather than an error.
Log exports and event streams arrive as one JSON object per line. Getting them into a spreadsheet means reconciling records that do not all share the same fields — which this converter does by building the header from every key it sees.
Reading JSONL
Auto-detect reads the first rows and picks the separator that splits them consistently.
Turn off when the file starts straight into data. Columns are then named column_1, column_2, and so on.
Turns "42" into a number and "true" into a boolean. Values with leading zeros stay text so IDs and zip codes survive.
Which worksheet to convert. Filled in once the workbook is read.
Dotted path to the array of records, such as data.items. Leave empty to use the whole document.
Turns {"user":{"id":7}} into a user.id column. Arrays are kept as JSON text.
Pick the encoding the file was written in. Wrong encoding shows up as garbled accents.
Comma-separated words that should become null instead of text.
Writing CSV
Snappy is the default across Spark, DuckDB and pandas. Gzip is smaller but slower to read.
Turns a user.id column back into {"user":{"id":7}}.
Excel needs a byte order mark to open UTF-8 files with accents correctly.
Rows per row group. Larger groups compress better; smaller groups let readers skip more.
conversion-preroll
This short ad is what keeps the converter free.
One JSON object per line, built for streaming and appending. Plain text rows that open anywhere, with no types and no schema.
| JSONL | CSV | |
|---|---|---|
| Type information | Strings, numbers, booleans, null | None — every value is text |
| Structure | One nested object per line | Flat rows and columns |
| Compression | None | None |
| Typical file size | Slightly under JSON | Baseline (100%) |
| Schema | Implicit, per line | Header row at best |
| Human-readable | Yes, one record at a time | Yes, in any text editor |
| Tool support | Log pipelines, LLM training sets, BigQuery | Universal |
Events gain fields over time. Records written before a field existed get an empty cell for it, which is accurate rather than an error.
The header has to be the union of every key, so every line is parsed before the first row is written. That is why memory, not file size, is the limit.
Structured logs nested several levels deep can produce dozens of columns. Targeting a subset with a record path keeps it readable.
Filtering and pivoting in Excel is often the quickest route to an answer for a one-off question.
CSV is the format everyone can open.
Many analytics and CRM imports accept nothing else.
sticky-bottomYour file is downloading
post-conversion