这是一个用于比较表、生成其差异摘要并将此类摘要用作补丁文件的库。它针对比较共享共同来源的表(即“同一”表的多个版本)进行了优化。
有关现场演示,请参阅:
https://paulfitz.github.io/daff/
安装您最喜欢的语言的库:
npm install daff -g # node/javascript
pip install daff # python
gem install daff # ruby
composer require paulfitz/daff-php # php
install.packages( ' daff ' ) # R wrapper by Edwin de Jonge
bower install daff # web/javascript
其他翻译可以在这里找到:
https://github.com/paulfitz/daff/releases
或者使用该库通过 chrome 扩展在 github 上查看 csv 差异:
https://github.com/theodi/csvhub
daff
使用的 diff 格式在这里指定:
http://paulfitz.github.io/daff-doc/spec.html
该库是 coopy 工具箱的精简版本(请参阅 http://share.find.coop)。要比较不同来源的表、自动生成的 ID 或其他复杂情况,请查看 coopy 工具箱。
您可以将daff
/ daff.py
/ daff.rb
作为实用程序运行:
$ daff
daff can produce and apply tabular diffs.
Call as:
daff a.csv b.csv
daff [--color] [--no-color] [--output OUTPUT.csv] a.csv b.csv
daff [--output OUTPUT.html] a.csv b.csv
daff [--www] a.csv b.csv
daff parent.csv a.csv b.csv
daff --input-format sqlite a.db b.db
daff patch [--inplace] a.csv patch.csv
daff merge [--inplace] parent.csv a.csv b.csv
daff trim [--output OUTPUT.csv] source.csv
daff render [--output OUTPUT.html] diff.csv
daff copy in.csv out.tsv
daff in.csv
daff git
daff version
The --inplace option to patch and merge will result in modification of a.csv.
If you need more control, here is the full list of flags:
daff diff [--output OUTPUT.csv] [--context NUM] [--all] [--act ACT] a.csv b.csv
--act ACT: show only a certain kind of change (update, insert, delete, column)
--all: do not prune unchanged rows or columns
--all-rows: do not prune unchanged rows
--all-columns: do not prune unchanged columns
--color: highlight changes with terminal colors (default in terminals)
--context NUM: show NUM rows of context (0=none)
--context-columns NUM: show NUM columns of context (0=none)
--fail-if-diff: return status is 0 if equal, 1 if different, 2 if problem
--id: specify column to use as primary key (repeat for multi-column key)
--ignore: specify column to ignore completely (can repeat)
--index: include row/columns numbers from original tables
--input-format [csv|tsv|ssv|psv|json|sqlite]: set format to expect for input
--eol [crlf|lf|cr|auto]: separator between rows of csv output.
--no-color: make sure terminal colors are not used
--ordered: assume row order is meaningful (default for CSV)
--output-format [csv|tsv|ssv|psv|json|copy|html]: set format for output
--padding [dense|sparse|smart]: set padding method for aligning columns
--table NAME: compare the named table, used with SQL sources. If name changes, use 'n1:n2'
--unordered: assume row order is meaningless (default for json formats)
-w / --ignore-whitespace: ignore changes in leading/trailing whitespace
-i / --ignore-case: ignore differences in case
daff render [--output OUTPUT.html] [--css CSS.css] [--fragment] [--plain] diff.csv
--css CSS.css: generate a suitable css file to go with the html
--fragment: generate just a html fragment rather than a page
--plain: do not use fancy utf8 characters to make arrows prettier
--unquote: do not quote html characters in html diffs
--www: send output to a browser
支持的格式有 CSV、TSV、Sqlite(带有--input-format sqlite
或.sqlite
扩展名)和 ndjson。
运行daff git csv
将 daff 安装为存储库中*.csv
文件的差异和合并处理程序。运行daff git
以获取有关手动执行此操作的说明。你的 CSV 差异和合并将变得更加智能,因为 git 会突然理解行和列,而不仅仅是行:
您可以使用任何受支持语言的daff
作为库。我们这里以 Javascript 为例。要在网页上使用daff
,首先包含daff.js
:
< script src =" daff.js " > </ script >
或者如果在浏览器外部使用节点:
var daff = require ( 'daff' ) ;
具体而言,假设我们有两个版本的表: data1
和data2
:
var data1 = [
[ 'Country' , 'Capital' ] ,
[ 'Ireland' , 'Dublin' ] ,
[ 'France' , 'Paris' ] ,
[ 'Spain' , 'Barcelona' ]
] ;
var data2 = [
[ 'Country' , 'Code' , 'Capital' ] ,
[ 'Ireland' , 'ie' , 'Dublin' ] ,
[ 'France' , 'fr' , 'Paris' ] ,
[ 'Spain' , 'es' , 'Madrid' ] ,
[ 'Germany' , 'de' , 'Berlin' ]
] ;
为了使库可以访问这些表,我们将它们包装在daff.TableView
中:
var table1 = new daff . TableView ( data1 ) ;
var table2 = new daff . TableView ( data2 ) ;
我们现在可以计算两个表中行和列之间的对齐方式:
var alignment = daff . compareTables ( table1 , table2 ) . align ( ) ;
为了产生比对的差异,我们首先需要一个输出表:
var data_diff = [ ] ;
var table_diff = new daff . TableView ( data_diff ) ;
使用差异的默认选项:
var flags = new daff . CompareFlags ( ) ;
var highlighter = new daff . TableDiff ( alignment , flags ) ;
highlighter . hilite ( table_diff ) ;
差异现在采用荧光笔格式的data_diff
,请参阅此处的规范:
http://paulfitz.github.io/daff-doc/spec.html
[ [ '!' , '' , '+++' , '' ] ,
[ '@@' , 'Country' , 'Code' , 'Capital' ] ,
[ '+' , 'Ireland' , 'ie' , 'Dublin' ] ,
[ '+' , 'France' , 'fr' , 'Paris' ] ,
[ '->' , 'Spain' , 'es' , 'Barcelona->Madrid' ] ,
[ '+++' , 'Germany' , 'de' , 'Berlin' ] ]
为了可视化,您可能希望将其转换为在单元格上具有适当类的 HTML 表格,以便您可以对插入、删除、更新等进行颜色编码。您可以通过以下方式执行此操作:
var diff2html = new daff . DiffRender ( ) ;
diff2html . render ( table_diff ) ;
var table_diff_html = diff2html . html ( ) ;
对于三向差异(即,在已知共同祖先的情况下比较两个表),请使用daff.compareTables3
(将祖先表作为第一个参数)。
以下是如何将该差异应用为补丁:
var patcher = new daff . HighlightPatch ( table1 , table_diff ) ;
patcher . apply ( ) ;
// table1 should now equal table2
对于其他语言,您应该在“版本”页面上的包中找到示例代码。
daff
库是用 Haxe 编写的,它至少可以很好地翻译成以下语言:
daff
开发的非官方 haxe 目标)发布页面上已为您完成了一些翻译。要进行另一个翻译,或从源代码编译,请首先遵循您关心的语言的 Haxe 语言简介。在撰写本文时,如果您使用的是 OSX,则应使用brew install haxe
安装haxe。然后执行以下操作之一:
make js
make php
make py
make java
make cs
make cpp
对于每种语言, daff
库都希望为您创建的表提供一个接口,而不是自己创建它们。这是为了避免从一种格式到另一种格式的低效复制。如果您觉得这很尴尬,您会发现可以使用SimpleTable
类。
其他可能性:
daff
类make
获取数据的教程,其中包含 daff。 “由于 git 考虑每行的更改,因此查看逗号分隔和制表符分隔文件的差异可能会变得令人讨厌。程序 daff 解决了这个问题。” daff 根据 MIT 许可证分发。