這是一個用於比較表、生成其差異摘要並將此類摘要用作補丁文件的庫。它針對比較共享共同來源的表(即「同一」表的多個版本)進行了最佳化。
有關現場演示,請參閱:
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 許可證分發。