Command Palette

Search for a command to run...

CSV 差异:比较两个没有对您说谎的行差异的 CSV 文件

CSV 差异:比较两个没有对您说谎的行差异的 CSV 文件

T
Toolz Team
|Aug 23, 2026|17 最小读数

差异和比较 合集的一部分

bug报告让我构建了这个三个字长:"同步是掉行。"一个客户端's产品源以夜间csv的形式出现,我的laravel导入器重写了它,在两个文件之间的某个地方,一把sku正在消失。我的第一直觉是显而易见的一个:将两个文件都扔进一条行diff中。diff又恢复为纯红色。每一行都是"更改的,"因为导出在那天晚上已经被不同的列重新排序,所以旧文件中的第4行是新文件中的第900行。diff行在技术上是正确的,完全没有用。我实际需要的是一个工具,它理解文件是一个表,由sku将每一行与其对应行相匹配,并告诉我哪些记录是真正添加,删除或编辑的。那个工具是toolz CSV 差异检查器的,而这份指南就是背后的推理。

TL;博士: CSV diff 将两个 CSV 文件作为结构化数据而不是文本行进行比较。通过关键列匹配行,例如 idemail 并且每条记录在文件中移动的任何地方都会与其对应的记录进行比较,因此重新排序的导出不会报告数千个错误更改。toolz 工具使用 RFC 4180 状态机解析这两个文件,将结果分成添加、删除和更改的行,并显示每个更改的行都不同的确切单元格。它完全运行客户端:无上传、无注册、离线工作。

Laravel和React上构建SaaS产品,并运送WordPress插件,这意味着我花了很多时间来协调出口:一个系统's对另一个数据的看法's,昨晚's快照反对今晚's,客户发誓他们发送的文件反对实际到达的文件CSV是所有它的通用语言,正确地比较两个CSV是那些看起来微不足道的任务之一,直到你尝试用错误的工具来完成这是我希望沮丧的版本我读过的指南。

什么是 CSV 差异检查器?

CSV diff 检查器采用两个 CSV 文件,一个原始版本和一个更改版本,并报告第二个在行和单元格级别上与第一个的不同之处。而不是文本 diff 的加删行输出,您将获得四个桶:仅存在于新文件中的行(已添加)、仅存在于旧文件中的行(已删除)、两者中存在但值不同(已更改)的行以及相同(未更改)的行。对于每个更改的行,一个好的工具会更深入一级,并命名移动的特定列,显示新列旁边的旧值。

使整个事情发挥作用的区别在于行如何在两个文件上配对。 CSV diff 可以通过关键列进行匹配,将值视为一个值 id 或者一个 email 为记录的身份,或者它可以按位置匹配,比较第一行到第一行,密钥匹配是你几乎每次比较导出时都想要的,因为每次拉取数据时,同一条记录可以降落在不同的位置匹配,对于线号本身有意义且稳定的文件,就像一个只有附加到一个编号的分类账一样,选择正确的模式是最重要的单一决定,也是toolz工具将其放在前面和中心而不是猜测的原因。

为什么重新排序的导出时线差异会完全变红?

这是发送人们寻找 CSV 特定工具的失败,因此值得精确理解。文本 diff,Git 和每个代码编辑器中内置的类型,逐行按顺序比较文件。它运行一个算法,找到行的最长公共子序列,并将其他所有内容标记为插入或删除。这对于源代码来说是完全正确的,其中行的顺序是文件的含义。移动函数,您确实更改了文件。

CSV导出相反,行顺序通常是不管怎样的意外 ORDER BY query 恰好用,在包含相同数据的两个运行之间可以改变,排序顺序转移的那一刻,一行 diff 几乎看到每一行都处于一个新的位置,未能对它们进行排序,并将整个文件报告为已更改的要的信息,实际上三个记录更改了,被埋在数千个误报下,diff 忠实地完成了它的工作;它只是回答了关于行的问题,当你对记录有疑问时。

CSV diff 修复了这一点,方法是先将文件解析成行和列,然后用它们的键而不是它们的行号来比较记录,重新排序文件没有效果,因为 SKU A-1007 与 SKU 的行进行比较 A-1007 在另一个文件中,无论其中一个文件位于何处。这就是该类别存在的全部原因,也是我达到该类别的原因 CSV 差异工具 代替 git diff 每当文件是数据而不是代码时。

RFC 4180与比较文件有什么关系?

Everything,因为如果不能先正确解析,就不能正确比较两个CSV,CSV在有人标准化之前就已经使用了几十年,2005年IETF发表了 RFC 4180其中描述了通用格式和 text/csv MIME类型。它不是每个工具都遵守的法律,但它是最接近共享合约的东西,它定义了一个天真的比较会出错的规则。

Zui重要的规则是引用,一个字段可能用双引号包起来,而且一定是如果它包含逗号、双引号或换行符,一个被引号字段内部的双引号通过加倍逃脱了,所以值 "Doe, John" 是一个字段,并且 "She said ""hi""" 是值 She said "hi".在逗号上分割每一行的比较会剪切 "Doe, John" 成两个字段,在它之后移动每一列,然后自信地报告该行在没有它时发生了变化。toolz diff 运行相同的 RFC 4180 状态机,为该行提供电源 CSV 查看器:逐个字符地走文字,跟踪是否在引用的字段内,只在引号外时把逗号或换行当作分隔符,解析对了是diff对的前提,是手卷脚本几乎总是跳过的部分。

如何将两个 CSV 文件与该工具进行比较?

Flow 故意短,将原文件粘贴到第一个框中,将更改后的文件粘贴到第二个框中,或者点击加载样本,可以看到一个工作示例,其中编辑了一行,添加了一行,删除了一行。

Confirm the delimiter。auto-detect分数逗号, 分号,选项卡, 和管道通过如何一致的每一个拆分前几行相同的列, 这正确处理欧洲分号文件和选项卡分离导出, 如果检测错误对你的数据, 设置手头开关, 如果第一行每个文件持有列名, 这是喂关键 - 列选择器。

Now选择行是如何匹配的,从下拉中选择一个关键列,通常是一个 idemail(或 SKU),并且工具会按该值比较记录,选择位置代替逐行比较,两个切换器细化比较:打开大小写不敏感匹配 if Activeactive 应计数为相同的值,并在上面留下修剪空格,以便杂散的领先空间不会注册为更改单击比较,摘要一目了然显示四个计数打开更改选项卡可展开每个编辑的行并准确查看哪些单元格移动,或添加和删除选项卡可将整行视为表当您完成后,复制报告或下载将每个差异的纯文本摘要导出,包括每个更改单元格的前后值,准备粘贴到拉取请求、票证或电子邮件中客户端。

我应该什么时候按键与按位置进行匹配?

这是决定差异有用还是噪声的选择,所以这是我使用的规则,作为表格排列。

情况 匹配 为什么
可以重新排序的数据库或 API 导出 关键栏 相同的记录落在不同的线上,每个拉;关键是其稳定的身份
协调两个系统'同一记录的视图 关键栏 您关心记录是否存在并且双方都匹配,而不是记录所在的位置
昨晚's快照与今晚's的对比 关键栏 随着时间的推移,行会添加和删除,因此行号会漂移
仅附加日志或具有固定订单的分类账 位置 行号稳定且有意义; N行是真正的"第N次事件"
您知道的两个文件共享完全相同的行顺序 位置 不存在密钥,但保证排序相同
一个根本没有唯一列的文件 位置 没有什么需要键入的,所以按顺序比较并接受限制

The short version: reach for key matching by 默认,因为大多数CSV都是导出带有标识符的记录,只有在没有可用密钥或者行顺序是真正的数据的一部分时,才回落到位置匹配,如果你选择一个密钥,工具警告列包含重复值,那是一个信号,列实际上不是唯一的,你要么选择一个更好的密钥,要么清理源,我抓到不止一个坏导出,正是因为"unique" ID列结果不是。

它如何显示实际连续发生的变化?

"5行更改的计数"是一个开始,但你真正遇到的问题是"更改了如何?"Toolz diff回答每行当匹配的记录不同时,它逐列比较两个版本,仅列出移动的单元格,每个单元格显示为在新值旁边击穿的前一个客户行,其中只有 plan 列从 freepro 报告称,是单细胞,而不是整个记录,因此您不会留意两排长长的行,试图发现一个发生变化的场。

CSV diff 在电子表格上获得保留的地方,这种单元格级别的视图's 自己的比较功能,这些功能倾向于突出显示带有颜色的单元格,但不会给你任何东西来复制或粘贴到评论中。导出的报告在文本中拼写每个更改:行的键,列名称,以及新旧值。在实践中,我将它直接粘贴到拉取请求的描述中,这样审查者就可以在不打开文件本身的情况下看到迁移的数据影响。这与结构背后的本能相同 JSON 差异的,它报告了更改的键与他们的路径而不是噪音线变化;这两种工具的存在是因为"什么改变了"是一个比"哪些线不同的问题更好"

在线比较敏感的 CSV 文件安全吗?

对于这个工具,是的,原因是架构而不是小指的承诺。每一步,解析两个文件、匹配行、计算每个单元格的差异以及构建报告,在您自己的浏览器选项卡内以 JavaScript 形式运行。没有上传,没有服务器往返,也没有记录或存储任何内容。您可以通过打开浏览器's 网络选项卡并单击比较来证明这一点:没有请求离开页面。一旦页面加载,您可以完全断开与互联网的连接,并且它继续工作。

这很重要,因为 CSV 人不同是企业拥有的最敏感的文件之一。客户列表、交易导出、工资单行、库存表和访问日志都以 CSV 的形式传输。将您的文件上传到服务器的比较工具,无论多么善意,都会将两个私有电子表格变成其他人's 日志条目。客户端处理消除了问题:数据永远不会离开它启动的机器。该默认值是故意的,遍布 toolz。dev 上的每个工具,我在其中写下了较长的参数 在线工具的数据隐私指南 对于任何想要完整推理的人。

CSV diff 如何适应实际的工作流程?

diff很少是整个工作;它是一个管道中的一个站点,我最常打的模式是验证:我运行导入或迁移,然后diff导出前后以确认脚本完全按照我的预期做了,仅此而已。"三个更改,零删除"的干净差异是一个比运行它的脚本中的绿色复选标记更好的迁移工作的符号。当diff显示我无意删除时,我已经抓住了bug,然后它到达生产。

它周围的工具取决于文件的用途。如果我需要将文件作为可排序网格进行眼球检查,然后再进行比较 CSV 查看器 renders 相同的 RFC 4180 解析为表,如果我想要的比较真的是关于成员资格,哪个值出现在一个文件中,而不是另一个而不是哪些行发生了变化,the 比较两个列表工具 does 在单列上设置算术,并且更适合。并且当数据需要成为 API 可以消耗的东西时, CSV 到 JSON 转换器 is 下一跳。这些都没有上传你的数据, 所以你不用再想, 就可以把它们链在同一个私有档案上。如果你正在为这种数据工作组装一个套件, my web开发人员工具包指南 浏览各个部分的连接方式。

常见问题

如何比较两个 CSV 文件? 打开 CSV 差异检查器、将原来的CSV粘贴到第一个框中,将更改后的CSV粘贴到第二个框中,确认分隔符和头设置,选择关键列或位置匹配,然后点击比较,结果被分成添加、删除和更改的行,每个更改的行显示出确切的单元格,这些单元格在您的浏览器中运行,因此文件永远不会上传。

键匹配和位置匹配有什么区别? Key 匹配对在所选列中共享相同值的行,例如 id(so)个记录,所以无论它出现在任一文件中的任何一个位置,都会与它的对应位置进行比较,位置匹配将第一行与第一行按文件顺序进行比较,对可以重新排序的导出使用密钥匹配,对固定顺序文件使用位置匹配,就像仅附加日志一样。

为什么文本差异显示每行在数据几乎不移动时都发生了变化? 为文本 diff 逐行按顺序比较文件,如果重新排序导出,几乎每行都降落在新的位置,diff 将整个文件标记为已更改,即使底层记录相同,CSV diff 将文件解析为行和列,并按键比较记录,因此重新排序没有效果,仅报告真正的更改。

它是否显示哪个特定单元格连续更改? Yes。匹配的行不同时,工具会按名称列出每个更改的列,并在新值旁边显示上一个值。只有状态列从活动移到关闭的行会报告单单元格而不是标记整个行。

它支持哪些分隔符? Comma,分号,tab,pipe。delimiter是从第一个文件中自动检测的,方法是选择在前几行产生一致列计数的分隔符,当检测对数据错误时,您可以手动覆盖它。

如果我的关键列有重复值会发生什么? 该工具警告您,密钥列包含重复项,并且仅比较每个密钥的第一行。重复密钥通常意味着该列不是真正的唯一标识符,因此警告是在信任 diff 之前选择不同密钥或清理数据的提示。

我的 CSV 文件是否上传到任何地方? No。All解析和比较在你的浏览器本地运行,使用普通的JavaScript。Nothing都不会传输,记录或存储,你可以在没有出现请求的网络选项卡中确认。一旦页面加载,该工具也会保持离线工作。

它可以处理多大的文件? Key matching 使用的是 hash maps 而不是嵌套循环,所以大致线性缩放,舒适地处理数万行,实际限制是你的浏览器渲染一个非常大的结果集,而不是比较本身。

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!