CSV Libraries in 2026: The Streaming Parsers Beat the One-Call Parsers
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
| Package | First 30 days | Last 30 days | Change | Shape |
|---|---|---|---|---|
csv-parse | 23.43M | 90.35M | +286% | Node stream (stream.Transform) |
@fast-csv/parse | 9.139M | 80.61M | +782% | Node stream |
fast-csv | 8.983M | 79.45M | +784% | Wrapper over the row above |
exceljs | 7.215M | 73.62M | +10.2× | Workbook read/write |
papaparse | 12.3M | 72.63M | +490% | Browser, workers, string-in |
xlsx | 10.02M | 57.46M | +473% | SheetJS spreadsheet |
csv-stringify | 15.81M | 45.37M | +187% | Node stream (output) |
csvtojson | 3.605M | 5.726M | +59% | CLI / one-call converter |
node-csv | 0.05M | 0.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/parseand@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-csvorcsvtojsonunless you have a reason this table does not know about.
What these numbers cannot tell you
- Wrapper and wrapped inflate each other.
fast-csvand@fast-csv/parseare 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
papaparseversuscsv-parseis not a beauty contest — most projects install exactly one of them.
Related
- CSV trends 2026 — the wider adoption picture
- CSV alternatives — when to stop using CSV at all
- CSV best practices — quoting, delimiters, and encoding traps