Esta es una biblioteca para comparar tablas, producir un resumen de sus diferencias y utilizar dicho resumen como un archivo de parche. Está optimizado para comparar tablas que comparten un origen común, en otras palabras, múltiples versiones de la "misma" tabla.
Para una demostración en vivo, consulte:
https://paulfitz.github.io/daff/
Instale la biblioteca para su 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
Otras traducciones están disponibles aquí:
https://github.com/paulfitz/daff/releases
O use la biblioteca para ver diferencias csv en github a través de una extensión de Chrome:
https://github.com/theodi/csvhub
El formato diff utilizado por daff
se especifica aquí:
http://paulfitz.github.io/daff-doc/spec.html
Esta biblioteca es una versión simplificada de la caja de herramientas coopy (consulte http://share.find.coop). Para comparar tablas de diferentes orígenes, o con ID generadas automáticamente u otras complicaciones, consulte la caja de herramientas de coopy.
Puede ejecutar daff
/ daff.py
/ daff.rb
como programa de utilidad:
$ 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
Los formatos admitidos son CSV, TSV, Sqlite (con --input-format sqlite
o la extensión .sqlite
) y ndjson.
Ejecute daff git csv
para instalar daff como controlador de diferencias y fusión para archivos *.csv
en su repositorio. Ejecute daff git
para obtener instrucciones sobre cómo hacerlo manualmente. Tus diferencias y fusiones de CSV se volverán más inteligentes, ya que git de repente entenderá acerca de filas y columnas, no solo líneas:
Puede utilizar daff
como biblioteca desde cualquier idioma compatible. Tomamos aquí el ejemplo de Javascript. Para usar daff
en una página web, primero incluya daff.js
:
< script src =" daff.js " > </ script >
O si usa un nodo fuera del navegador:
var daff = require ( 'daff' ) ;
Para ser más concretos, supongamos que tenemos dos versiones de una tabla, data1
y 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 que la biblioteca pueda acceder a esas tablas, las envolvemos en daff.TableView
:
var table1 = new daff . TableView ( data1 ) ;
var table2 = new daff . TableView ( data2 ) ;
Ahora podemos calcular la alineación entre las filas y columnas de las dos tablas:
var alignment = daff . compareTables ( table1 , table2 ) . align ( ) ;
Para producir una diferencia a partir de la alineación, primero necesitamos una tabla para el resultado:
var data_diff = [ ] ;
var table_diff = new daff . TableView ( data_diff ) ;
Usando opciones predeterminadas para la diferencia:
var flags = new daff . CompareFlags ( ) ;
var highlighter = new daff . TableDiff ( alignment , flags ) ;
highlighter . hilite ( table_diff ) ;
La diferencia ahora está en data_diff
en formato resaltador, consulte las especificaciones aquí:
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 la visualización, es posible que desee convertir esto en una tabla HTML con clases apropiadas en las celdas para que pueda codificar con colores inserciones, eliminaciones, actualizaciones, etc. Puede hacer esto con:
var diff2html = new daff . DiffRender ( ) ;
diff2html . render ( table_diff ) ;
var table_diff_html = diff2html . html ( ) ;
Para diferencias de tres vías (es decir, comparar dos tablas dado el conocimiento de un ancestro común), utilice daff.compareTables3
(proporcione la tabla de ancestros como primer argumento).
A continuación se explica cómo aplicar esa diferencia como parche:
var patcher = new daff . HighlightPatch ( table1 , table_diff ) ;
patcher . apply ( ) ;
// table1 should now equal table2
Para otros idiomas, debería encontrar código de muestra en los paquetes en la página Lanzamientos.
La biblioteca daff
está escrita en Haxe, que se puede traducir razonablemente bien al menos a los siguientes idiomas:
daff
) Algunas traducciones se realizan para usted en la página de Lanzamientos. Para hacer otra traducción o compilar desde el código fuente, primero siga la introducción del idioma Haxe para el idioma que le interese. Al momento de escribir este artículo, si está en OSX, debe instalar haxe usando brew install haxe
. Luego haz uno de:
make js
make php
make py
make java
make cs
make cpp
Para cada idioma, la biblioteca daff
espera recibir una interfaz para las tablas que usted crea, en lugar de crearlas ella misma. Esto es para evitar copias ineficientes de un formato a otro. Encontrarás una clase SimpleTable
que puedes usar si esto te resulta incómodo.
Otras posibilidades:
daff
en http://paulfitz.github.io/daff-doc/ make
para datos, con tonterías en la mezcla. "Dado que git considera los cambios por línea, observar las diferencias de archivos delimitados por comas y por tabulaciones puede resultar desagradable. El programa daff soluciona este problema". daff se distribuye bajo la licencia MIT.