JavaScript CSV 解析器比较

JavaScript CSV Parsers ComparisonFinding the most robust, fast and easy to use CSV Parser available on NPM.https://leanylabs.com/blog/js-csv-parsers-benchmarks/

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
  • 有简单的回调 APIparse(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 是一个瓶颈。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值