Это библиотека для сравнения таблиц, создания сводки их различий и использования такой сводки в качестве файла исправления. Он оптимизирован для сравнения таблиц, имеющих общее происхождение, то есть нескольких версий «одной и той же» таблицы.
Живую демонстрацию см.:
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
Или используйте библиотеку для просмотра различий csv на github через расширение Chrome:
https://github.com/theodi/csvhub
Здесь указан формат различий, используемый daff
:
http://paulfitz.github.io/daff-doc/spec.html
Эта библиотека представляет собой урезанную версию набора инструментов coopy (см. http://share.find.coop). Чтобы сравнить таблицы из разных источников, с автоматически сгенерированными идентификаторами или с другими сложностями, воспользуйтесь набором инструментов 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 >
Или, если вы используете node вне браузера:
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 для интересующего вас языка. На момент написания, если вы используете OSX, вам следует установить haxe с помощью brew install haxe
. Затем выполните одно из:
make js
make php
make py
make java
make cs
make cpp
Для каждого языка библиотека daff
ожидает получить интерфейс к создаваемым вами таблицам, а не создавать их самостоятельно. Это сделано для того, чтобы избежать неэффективного копирования из одного формата в другой. Вы найдете класс SimpleTable
, который можно использовать, если вам это покажется неудобным.
Другие возможности:
daff
по адресу http://paulfitz.github.io/daff-doc/. make
для данных с добавлением daff. «Поскольку git учитывает изменения построчно, просмотр различий в файлах, разделенных запятыми и табуляцией, может стать неприятным. Программа daff решает эту проблему». daff распространяется по лицензии MIT.