Skip to main content
PulsarKit

CSV vs Excel vs JSON, Measured on One 10,000-Row Table

We ran one 10,000-row table through CSV, Excel and JSON with six converters. Here are the file sizes, the zipped sizes, the times and every cell that came back different.

By PulsarKit ·

The short answer

For a flat table, CSV made the smallest text file: 1.2 MB for our 10,000 rows. The same rows came to 2.7 MB as indented JSON and 2 MB as NDJSON. Zipped, CSV and JSON ended up close: 357 KB against 398 to 424 KB.

The bigger differences showed up on the way back. A round trip through Excel or through JSON, on default settings, changed 10,960 of 100,000 cells, and not the same ones. One setting made the trip through Excel exact. Only JSON kept nested fields: once they passed through CSV or a spreadsheet, they never came back. So pick the format by what reads the file next.

How we measured

On October 21, 2026, we built a test table with a script: 10,000 rows and 10 columns of invented data. It has IDs with leading zeros such as 000001, 13-digit barcodes and 19-digit account numbers. It also has ISO dates and amounts with two decimals, about half of them negative. Names mix Latin, accented and Cyrillic letters, with an emoji in every hundredth row. One note in a hundred holds a comma, quotes and a line break. The coupon column is empty in 3,096 rows, and every phone number starts with a plus sign.

We ran it through six converters on pulsarkit.com: CSV to Excel, Excel to CSV, CSV to JSON, JSON to CSV, Excel to JSON and JSON to Excel. We used Chrome 155 on a 2023 MacBook. All six work inside the browser tab, and settings stayed at their defaults unless we name them. The clock ran from the button press to the Download button. Our own script then compared every returned cell with the original, and we read the cell types inside each workbook. Zipped sizes come from a standard ZIP, Deflate at level 6.

Size, zipped size and speed

CSV writes the column names once, at the top. JSON repeats them in every record. With its default indent of two spaces, CSV to JSON turned the table into 2.7 MB, 2.3 times the CSV. NDJSON, one compact record per line, came to 2 MB. JSON Formatter set to Minify turned the indented file into the same 2 MB, 23.6 percent off.

A ZIP removes most of that gap, because repeated keys are exactly what compression is good at. Zipped, the CSV came to 357 KB, the NDJSON to 398 KB and the indented JSON to 424 KB.

An XLSX file is a ZIP already, so its weight depends on the program that writes it. The sheet from CSV to Excel, saved again by LibreOffice Calc, took 753 KB. When only size matters, send the zipped CSV.

Speed did not separate the formats. We timed 60 runs, and the median conversion of the 10,000 rows took about a third of a second. Of those, 49 took under half a second. The slowest, the first Excel to CSV of our session, took 2 seconds.

What a round trip changed

Through Excel: CSV to Excel, then Excel to CSV. Leading zeros, the 19-digit accounts, the barcodes, line breaks inside notes, emoji and empty cells all came back as they were. Two columns changed. Every true and false returned as TRUE and FALSE, since the workbook stores them as logical values. And 960 amounts lost a trailing zero, so 612.40 became 612.4: the workbook keeps the number, not the way it was written.

Through JSON: CSV to JSON, then JSON to CSV. The same 960 amounts lost their trailing zero, for the same reason. Every phone number came back with an apostrophe in front, as '+1 202 555 0117. JSON to CSV adds one to any value that starts with +, =, - or @ and is not a plain number. That way a spreadsheet cannot run it as a formula. Empty cells became empty strings in the JSON, while Excel to JSON wrote null for the same 3,096 cells. The JSON you get depends on the path, unless you set Empty cells become to null in CSV to JSON.

In a browser set to UTC or UTC+4, every date came through CSV to Excel unchanged. CSV to Excel writes each date as midnight UTC, so a browser set to New York time does not move it either.

One setting removed every change on the Excel route: Cell types set to Everything as text, in CSV to Excel. In New York time and in UTC+4 alike, the round trip then returned all 100,000 cells exactly as written. The price is a sheet of text cells, amounts too. Text also suits barcodes. On default settings our 13-digit codes became numbers in the General format. Microsoft's documentation says General shows 12 or more digits in scientific notation.

Nested data does not come back

Real JSON is rarely flat, so we gave every record an address object and a list of tags, 3.8 MB indented. JSON to CSV spread the address into columns named address.city and address.zip, and joined the tags into one cell, as in new, wholesale. JSON to Excel did the same.

Converted back to JSON, neither file found its old shape. Both gave flat keys such as address.city and a tags string instead of a list. The CSV route also changed types: 6,017 of the 10,000 ZIP codes, the ones without a leading zero such as 78701, came back as numbers, while 02134 stayed text. On that route, the empty coupons, null in our file, returned as empty strings. The Excel route kept every ZIP code as text and every null as null.

Which format to pick

If a person will sort, filter and add up the data, take XLSX. It keeps amounts as numbers, dates as dates and true or false as logical values. If a program reads the file, take JSON. It keeps numbers, true, false and null, and it is the only one of the three that holds nested fields. NDJSON is the same size as minified JSON and puts one record on each line.

If the file only moves between systems, a zipped CSV is the smallest of the three. Separators, encodings and the byte order mark can still trip up a CSV on its way into Excel. Our guide CSV to Excel and back without breaking your data covers them.

Tools used in this article

Read next