用于查看两个 CSV、TSV 或 JSON 文件之间差异的工具。请参阅为旧金山官方树木列表生成提交日志(以及sf-tree-history 仓库提交日志),了解该项目的背景信息。
pip install csv-diff
考虑两个 CSV 文件
one.csv
id,name,age
1,Cleo,4
2,Pancakes,2
two.csv
id,name,age
1,Cleo,5
3,Bailey,1
csv-diff
可以显示文件之间差异的易读摘要
"5" 1 row added id: 3 name: Bailey age: 1 1 row removed id: 2 name: Pancakes age: 2">
$ csv-diff one.csv two.csv --key=id
1 row changed, 1 row added, 1 row removed
1 row changed
Row 1
age: "4" => "5"
1 row added
id: 3
name: Bailey
age: 1
1 row removed
id: 2
name: Pancakes
age: 2
--key=id
选项意味着将 id
列视为唯一键,用于识别哪些记录已更改。
该工具会自动检测您的文件是逗号分隔还是制表符分隔。您可以使用 --format=tsv
或 --format=csv
覆盖此自动检测并强制工具使用特定格式。
您也可以向其提供 JSON 文件,前提是它们是一个对象数组,其中每个对象具有相同的键。如果您的输入文件是 JSON,请使用 --format=json
。
使用 --show-unchanged
在差异输出中包含至少有一处更改的行的未更改值的完整详细信息
"5" Unchanged: name: "Cleo"">
% csv-diff one.csv two.csv --key=id --show-unchanged
1 row changed
id: 1
age: "4" => "5"
Unchanged:
name: "Cleo"
您可以使用 --json
选项获取机器可读的差异
$ csv-diff one.csv two.csv --key=id --json
{
"added": [
{
"id": "3",
"name": "Bailey",
"age": "1"
}
],
"removed": [
{
"id": "2",
"name": "Pancakes",
"age": "2"
}
],
"changed": [
{
"key": "1",
"changes": {
"age": [
"4",
"5"
]
}
}
],
"columns_added": [],
"columns_removed": []
}
您可以使用 --extra
选项指定要在易读格式中显示的附加键
--extra name "Python format string with {id} for variables"
例如,要为每个带有 ID 的项目输出链接 https://news.ycombinator.com/latest?id={id}
,您可以使用此方法
csv-diff one.csv two.csv --key=id \
--extra latest "https://news.ycombinator.com/latest?id={id}"
这些附加信息会显示类似这样的内容
"25" numComments: "5" => "6" extras: latest: https://news.ycombinator.com/latest?id=41459472">
1 row changed
id: 41459472
points: "24" => "25"
numComments: "5" => "6"
extras:
latest: https://news.ycombinator.com/latest?id=41459472
您也可以将此 Python 库导入到您自己的代码中,如下所示
from csv_diff import load_csv, compare
diff = compare(
load_csv(open("one.csv"), key="id"),
load_csv(open("two.csv"), key="id")
)
现在,diff
将包含与上面 --json
示例中的输出相同的数据结构。
如果 CSV 中的列已更改,则在计算特定行的更改时,将忽略添加或删除的列。
$ docker build -t csvdiff .
$ docker run --rm -v $(pwd):/files csvdiff
假设当前目录包含两个 csv 文件:one.csv two.csv
$ docker run --rm -v $(pwd):/files csvdiff one.csv two.csv
- csvdiff 是一个“用于比较 CSV 文件的快速差异工具”——对于更大的文件,您可能会从它那里获得比
csv-diff
更好的结果。