Esta é uma biblioteca para comparar tabelas, produzir um resumo de suas diferenças e usar esse resumo como um arquivo de patch. É otimizado para comparar tabelas que compartilham uma origem comum, ou seja, múltiplas versões da "mesma" tabela.
Para uma demonstração ao vivo, consulte:
https://paulfitz.github.io/daff/
Instale a biblioteca para seu idioma favorito:
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
Outras traduções estão disponíveis aqui:
https://github.com/paulfitz/daff/releases
Ou use a biblioteca para visualizar diferenças csv no github por meio de uma extensão do Chrome:
https://github.com/theodi/csvhub
O formato diff usado pelo daff
é especificado aqui:
http://paulfitz.github.io/daff-doc/spec.html
Esta biblioteca é uma versão simplificada da caixa de ferramentas coopy (consulte http://share.find.coop). Para comparar tabelas de origens diferentes, ou com IDs gerados automaticamente, ou outras complicações, confira a caixa de ferramentas do coopy.
Você pode executar daff
daff.py
daff.rb
como um programa utilitário:
$ 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
Os formatos suportados são CSV, TSV, Sqlite (com --input-format sqlite
ou a extensão .sqlite
) e ndjson.
Execute daff git csv
para instalar o daff como um manipulador de comparação e mesclagem para arquivos *.csv
em seu repositório. Execute daff git
para obter instruções sobre como fazer isso manualmente. Suas diferenças e mesclagens de CSV ficarão mais inteligentes, já que o git de repente entenderá sobre linhas e colunas, não apenas linhas:
Você pode usar daff
como uma biblioteca de qualquer idioma compatível. Tomamos aqui o exemplo do Javascript. Para usar daff
em uma página da web, primeiro inclua daff.js
:
< script src =" daff.js " > </ script >
Ou se estiver usando o nó fora do navegador:
var daff = require ( 'daff' ) ;
Para ser mais concreto, suponha que temos duas versões de uma tabela, data1
e 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' ]
] ;
Para tornar essas tabelas acessíveis à biblioteca, nós as agrupamos em daff.TableView
:
var table1 = new daff . TableView ( data1 ) ;
var table2 = new daff . TableView ( data2 ) ;
Agora podemos calcular o alinhamento entre as linhas e colunas nas duas tabelas:
var alignment = daff . compareTables ( table1 , table2 ) . align ( ) ;
Para produzir uma diferença do alinhamento, primeiro precisamos de uma tabela para a saída:
var data_diff = [ ] ;
var table_diff = new daff . TableView ( data_diff ) ;
Usando opções padrão para o diff:
var flags = new daff . CompareFlags ( ) ;
var highlighter = new daff . TableDiff ( alignment , flags ) ;
highlighter . hilite ( table_diff ) ;
O diff agora está em data_diff
no formato de marcador, veja as especificações aqui:
http://paulfitz.github.io/daff-doc/spec.html
[ [ '!' , '' , '+++' , '' ] ,
[ '@@' , 'Country' , 'Code' , 'Capital' ] ,
[ '+' , 'Ireland' , 'ie' , 'Dublin' ] ,
[ '+' , 'France' , 'fr' , 'Paris' ] ,
[ '->' , 'Spain' , 'es' , 'Barcelona->Madrid' ] ,
[ '+++' , 'Germany' , 'de' , 'Berlin' ] ]
Para visualização, você pode querer converter isso em uma tabela HTML com classes apropriadas nas células para que você possa codificar por cores inserções, exclusões, atualizações, etc.
var diff2html = new daff . DiffRender ( ) ;
diff2html . render ( table_diff ) ;
var table_diff_html = diff2html . html ( ) ;
Para diferenças de três vias (ou seja, comparar duas tabelas com o conhecimento de um ancestral comum) use daff.compareTables3
(forneça a tabela ancestral como o primeiro argumento).
Veja como aplicar essa diferença como um patch:
var patcher = new daff . HighlightPatch ( table1 , table_diff ) ;
patcher . apply ( ) ;
// table1 should now equal table2
Para outras linguagens, você deve encontrar exemplos de código nos pacotes na página Releases.
A biblioteca daff
é escrita em Haxe, que pode ser razoavelmente bem traduzida para pelo menos os seguintes idiomas:
daff
) Algumas traduções são feitas para você na página Releases. Para fazer outra tradução ou compilar a partir do código-fonte, primeiro siga a introdução do idioma Haxe para o idioma de seu interesse. No momento em que este artigo foi escrito, se você estiver no OSX, deverá instalar o haxe usando brew install haxe
. Então faça um dos seguintes:
make js
make php
make py
make java
make cs
make cpp
Para cada linguagem, a biblioteca daff
espera receber uma interface para as tabelas que você cria, em vez de criá-las ela mesma. Isso evita cópias ineficientes de um formato para outro. Você encontrará uma classe SimpleTable
que poderá usar se achar isso estranho.
Outras possibilidades:
daff
em http://paulfitz.github.io/daff-doc/ make
para dados, com daff na mistura. "Como o git considera as alterações por linha, observar as diferenças de arquivos delimitados por vírgulas e delimitados por tabulações pode ser desagradável. O programa daff corrige esse problema." daff é distribuído sob a licença MIT.