CSV 是处理大量人类可读格式的表格数据的王者。它没有像 JSON 那样内置在 JavaScript 运行时中,虽然 NPM 注册表上有很多解析器,但每个都有其优点和缺点。与其他所有库一样,您必须仔细选择依赖项,因为切换它们可能需要一些工作。
我们与最受欢迎的产品进行了比较,以比较易用性、开发速度和性能,以帮助您做出更明智的决定。
性能基准
我们发现性能比易用性更重要,因为它会影响您的应用程序的用户,因为您对此无能为力。不是每个人都需要引用的 CSV 支持,因为未引用的文件更易于使用并且更常用于数据交换。这就是为什么我们决定针对这些场景、不同的行数和列数运行单独的测试。
基准测试从具有 10 列和 10k 行的相对较小的文件开始,大小略高于 1Mb,然后移动到相当大的 140Mb 文件,具有 100 列和 100k 行。我们分别增加行和列,以查看对性能影响最大的因素。解析的正确性通过一个简单的sum
.
我们测试的源代码可在 github 上找到。
非引用 CSV 解析器基准
我们决定在String.split
这里添加一个基线测试。它只是将整个文件加载到内存中,将其拆分为行,然后将每一行拆分为单独的列值。这是解析未引用的 CSV 文件的最快方法之一。在手动拆分所有内容的同时仅扫描一次数据就可以击败它。
PapaParse 在这些测试中以快速模式运行。如果您确定您的文件没有引用数据,您应该使用它。解析器可以根据数据自动切换到此模式,但我们会节省一些精力。
Dekkai 在 100k 行测试中崩溃,导致整个 Node 进程因一些 WASM 错误而崩溃。虽然这个想法很有趣,但它仍在开发中,我们不建议将它用于生产。
PapaParse 是最快的,甚至击败了String.split
. Dekkai 位居第二,但未能通过所有测试。CSV-parser 和 csv-parse 并列第三。坦率地说,fast-csv 是最慢的。
引用的 CSV 解析器基准
在引用的测试中,所有解析器都慢得多。虽然对于大多数解析器来说只有 20%,但 PapaParse 在禁用快速模式的情况下慢了 2 倍。尽管如此,它仍然是我们测试过的最快的。
Dekkai 无法再次处理 100k 测试,因此我们不得不禁用它们。
爸爸解析
PapaParse可能是目前最好的解析器。每周下载量约为 70 万,这并不奇怪。
优点:
- 非常容易使用,只需
Papa.parse(input, config)
- 可以解析字符串、本地文件,甚至可以下载远程文件
- 非引用数据的快速模式
- 流式支持解析大文件,包括 NodeJS 可读流
- 工作线程中的异步解析
- 自动类型转换
- 具有同步、流和回调 API
- 具有转换列标题和值的回调
- 快疯了
- 非常受欢迎
- 完全符合RFC 4180并正确处理换行符和引号
- 还可以从数组格式化 CSV
- 捆绑包大小只有 6.8k gzipped,没有依赖关系
CSV 解析
CSV-Parse是 CSV 模块的一部分。它甚至比 PapaParse 更受欢迎,每周有 140 万的下载量。该软件包于 2010 年首次发布,并且足够强大,可以被大型社区用于处理大型数据集。不过,它比 PapaParse 慢。
优点:
- 实现 Node.js stream.Transform API
- 有简单的回调 API
parse(input, options, callback)
- 对大型数据集的流式支持
- 广泛的测试覆盖
- 具有同步、流、回调和异步迭代器 API
- 只有 6.3k gzip 没有依赖关系
- 有配套的 CSV 模块来转换和编写 CSV 流
CSV 解析器
CSV-Parser是相当快的符合RFC 4180的解析器。非常受欢迎,每周下载 40 万次。它非常简约,只有流式 API 和疯狂的小包大小。尽管它的目标是最大速度,但性能与 csv-parse 相当,并且比 PapaParse 慢。
优点:
- 流媒体支持
- 具有修改列标题和值的回调函数
- 带有整洁 csv包装器的异步 API
- 最轻的解析器,压缩后只有 1.5k
快速CSV
Fast-CSV结合包来格式化和解析 CSV 文件。顾名思义,它一定非常快,但在此比较中,它是所有解析器中最慢的。尽管如此,它仍然非常受欢迎,每周下载量为 640k。
优点:
- 流媒体支持
- 有回调来修改标题和转换行
- 有验证支持
出海
Dekkai是基于Web Assembly构建的快速多线程 CSV 解析器。它仍处于预发布阶段,我们在解析大文件时遇到了一些问题,可能是由于在 RAM 中加载所有内容时内存消耗。WASM 非常重,您需要为它支付 24k 的 gzip 压缩包大小。与返回数组或对象数组的所有其他解析器不同,它为表和行生成其自定义对象。这很不方便,您可能应该转换它们以使您的逻辑独立于解析器代码。
优点:
- 二进制模式下的自动类型转换
- 仅迭代数据并为每一行调用回调的迭代模式
- 对于并行解析和大文件应该相当快
结论
如今,大多数 Web 应用程序都使用 JSON 进行通信。由于内置的浏览器支持和大量优化,它非常快。
虽然它甚至可能适用于表格数据,但 CSV 仍然很普遍,并且更容易加载到电子表格中进行手动分析。原始表格 JSON 的大小非常重要,虽然 gzip 压缩可以消除该因素,但压缩和解压缩大量数据流仍然较慢。
借助 NPM 中提供的各种开源库,解析 CSV 文件并不是什么大问题。对于大多数应用程序,我们建议使用 PapaParse 。它易于使用、功能强大且速度极快。选择它作为 CSV 解析器不会有问题。
对于不太依赖 CSV、不需要很多功能且不关心性能的应用程序, csv-parser可能是一个不错的选择。它完全兼容仅包含 3.6k JavaScript 代码的 1.5k 包大小。
Dekkai 走了一条有趣的路线,使用 WASM 解析 CSV。虽然解析代码可能运行得更快,但正如我们之前测试过的那样,在 WASM 和 JavaScript 运行时之间传输数据可能会破坏所有好处。解析 CSV 文件这样简单的任务可能就是这种情况。
最后,对于特定用例,您可能仍会使用自己的 CSV 解析器。例如,在我们开发的一个 BI 分析应用程序中,我们从 PapaParse 开始,然后切换到为我们的用例调整的自定义一次性疯狂快速实现,因为解析巨大的 CSV 是一个瓶颈。