CSVFormat CSV Converter

CSV Libraries in 2026: The Streaming Parsers Beat the One-Call Parsers

CSVFormat — CSV Formatter & Converter Guides · Updated 2026-10-12 · All guides

Survey answers about CSV are unreliable because almost nobody thinks about CSV until a file breaks. This page uses the install record instead: the npm downloads API, counting what build machines pulled.

Window: 2024-10-01 to 2026-10-10, pulled 2026-10-12. First 30 days against last 30. Swap the package name at the end of that URL to check any row.

The table

PackageFirst 30 daysLast 30 daysChangeShape
csv-parse23.43M90.35M+286%Node stream (stream.Transform)
@fast-csv/parse9.139M80.61M+782%Node stream
fast-csv8.983M79.45M+784%Wrapper over the row above
exceljs7.215M73.62M+10.2×Workbook read/write
papaparse12.3M72.63M+490%Browser, workers, string-in
xlsx10.02M57.46M+473%SheetJS spreadsheet
csv-stringify15.81M45.37M+187%Node stream (output)
csvtojson3.605M5.726M+59%CLI / one-call converter
node-csv0.05M0.01M−80%Older Node parser

Installs, not people, and not rows-parsed. All figures are my own pulls.

Read the ordering

The five fastest growers are all either streaming or workbook-shaped. The two slowest — csvtojson (+59%) and node-csv (−80%) — are the ones whose pitch is "hand me the whole string."

That is the shape of the market: CSV moved out of the browser callback and into data pipelines, and pipelines want backpressure. csv-parse and csv-stringify are literally stream.Transform implementations, which is why they get installed by anything that moves files rather than by anyone writing a <input type="file"> handler.

node-csv falling from 0.05M to 0.01M is an 80% collapse and the clearest lesson on this page. It was the default answer for a while. The packages that replaced it are not dramatically better at parsing; they are better at composing — a transform you can pipe is worth more than a function that returns an array.

papaparse at 72.63M still holds the browser niche outright. Nothing in this table does in-browser parsing with workers the way it does, and its +490% tells me the browser side is growing, not losing ground to Node.

xlsx has a frozen npm copy — check before you install it

xlsx shows 57.46M in the last window, which reads as healthy adoption. The publish record does not:

$ curl -s https://registry.npmjs.org/xlsx | jq '."/dist-tags".latest'
"0.18.5"
$ # published 2022-03-24

The npm registry copy has been at 0.18.5 since March 2022 — over four years without a release there, while downloads grew 473%. SheetJS moved distribution to their own CDN (the registry entry's homepage is https://sheetjs.com/). So the 57.46M is real installs of a real library, but an npm install xlsx today gets you a four-year-old build. If you need current SheetJS, install from their registry URL, not from npm. I verified the version and date directly against the registry on 2026-10-12.

exceljs is the counter-case: still published on npm, 4.4.0, last published 2023-10-19. Also stale, but not relocated, and its +10.2× is the fastest growth in the table.

Choosing

  • Browser, user drops a file: papaparse. Workers, streaming, and it is the one row here built for that context.
  • Node pipeline, large file: csv-parse / csv-stringify. Streams mean memory tracks chunk size instead of file size.
  • Want the fast API with fewer imports: fast-csv. Note it re-exports @fast-csv/parse — at 5.0.8 its dependencies are exactly @fast-csv/parse and @fast-csv/format, which is why those two rows track each other almost exactly (+784% and +782%). They are the same adoption counted twice, not two ecosystems.
  • Real spreadsheets with formatting: exceljs, accepting the 2023 release date.
  • Don't start new work on node-csv or csvtojson unless you have a reason this table does not know about.

What these numbers cannot tell you

  • Wrapper and wrapped inflate each other. fast-csv and @fast-csv/parse are one decision counted twice; summing them would be a fabrication.
  • Downloads are not rows. A 4GB nightly ETL job and a 20-row config file both register as installs.
  • The browser and Node rows are different populations, so papaparse versus csv-parse is not a beauty contest — most projects install exactly one of them.
Developer Sponsor / Partner
Copied to clipboard!