Il s'agit d'une bibliothèque permettant de comparer des tableaux, de produire un résumé de leurs différences et d'utiliser ce résumé comme fichier de correctif. Il est optimisé pour comparer des tables partageant une origine commune, c'est-à-dire plusieurs versions de la « même » table.
Pour une démo en direct, voir :
https://paulfitz.github.io/daff/
Installez la bibliothèque pour votre langue préférée :
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
D’autres traductions sont disponibles ici :
https://github.com/paulfitz/daff/releases
Ou utilisez la bibliothèque pour afficher les différences CSV sur github via une extension Chrome :
https://github.com/theodi/csvhub
Le format diff utilisé par daff
est spécifié ici :
http://paulfitz.github.io/daff-doc/spec.html
Cette bibliothèque est une version allégée de la boîte à outils coopy (voir http://share.find.coop). Pour comparer des tables d'origines différentes, ou avec des identifiants générés automatiquement, ou d'autres complications, consultez la boîte à outils coopy.
Vous pouvez exécuter daff
/ daff.py
/ daff.rb
en tant que programme utilitaire :
$ 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
Les formats pris en charge sont CSV, TSV, SQLite (avec --input-format sqlite
ou l'extension .sqlite
) et ndjson.
Exécutez daff git csv
pour installer daff en tant que gestionnaire de comparaison et de fusion pour les fichiers *.csv
dans votre référentiel. Exécutez daff git
pour obtenir des instructions sur la manière de procéder manuellement. Vos différences et fusions CSV deviendront plus intelligentes, puisque git comprendra soudainement les lignes et les colonnes, pas seulement les lignes :
Vous pouvez utiliser daff
comme bibliothèque à partir de n'importe quelle langue prise en charge. Nous prenons ici l'exemple de Javascript. Pour utiliser daff
sur une page Web, incluez d'abord daff.js
:
< script src =" daff.js " > </ script >
Ou si vous utilisez node en dehors du navigateur :
var daff = require ( 'daff' ) ;
Pour être concret, supposons que nous ayons deux versions d'une table, data1
et 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' ]
] ;
Pour rendre ces tables accessibles à la bibliothèque, nous les encapsulons dans daff.TableView
:
var table1 = new daff . TableView ( data1 ) ;
var table2 = new daff . TableView ( data2 ) ;
Nous pouvons maintenant calculer l'alignement entre les lignes et les colonnes des deux tableaux :
var alignment = daff . compareTables ( table1 , table2 ) . align ( ) ;
Pour produire une différence à partir de l'alignement, nous avons d'abord besoin d'un tableau pour la sortie :
var data_diff = [ ] ;
var table_diff = new daff . TableView ( data_diff ) ;
Utilisation des options par défaut pour le différentiel :
var flags = new daff . CompareFlags ( ) ;
var highlighter = new daff . TableDiff ( alignment , flags ) ;
highlighter . hilite ( table_diff ) ;
Le diff est maintenant au data_diff
au format surligneur, voir spécification ici :
http://paulfitz.github.io/daff-doc/spec.html
[ [ '!' , '' , '+++' , '' ] ,
[ '@@' , 'Country' , 'Code' , 'Capital' ] ,
[ '+' , 'Ireland' , 'ie' , 'Dublin' ] ,
[ '+' , 'France' , 'fr' , 'Paris' ] ,
[ '->' , 'Spain' , 'es' , 'Barcelona->Madrid' ] ,
[ '+++' , 'Germany' , 'de' , 'Berlin' ] ]
Pour la visualisation, vous souhaiterez peut-être le convertir en un tableau HTML avec les classes appropriées sur les cellules afin de pouvoir coder par couleur les insertions, les suppressions, les mises à jour, etc. Vous pouvez le faire avec :
var diff2html = new daff . DiffRender ( ) ;
diff2html . render ( table_diff ) ;
var table_diff_html = diff2html . html ( ) ;
Pour les différences à trois (c'est-à-dire la comparaison de deux tables étant donné la connaissance d'un ancêtre commun), utilisez daff.compareTables3
(donnez la table des ancêtres comme premier argument).
Voici comment appliquer cette différence sous forme de patch :
var patcher = new daff . HighlightPatch ( table1 , table_diff ) ;
patcher . apply ( ) ;
// table1 should now equal table2
Pour les autres langues, vous devriez trouver un exemple de code dans les packages sur la page Releases.
La bibliothèque daff
est écrite en Haxe, qui peut être raisonnablement bien traduite dans au moins les langues suivantes :
daff
) Certaines traductions sont réalisées pour vous sur la page Releases. Pour faire une autre traduction ou pour compiler à partir des sources, suivez d'abord l'introduction au langage Haxe pour la langue qui vous intéresse. Au moment de la rédaction, si vous êtes sous OSX, vous devez installer haxe en utilisant brew install haxe
. Ensuite, effectuez l'une des opérations suivantes :
make js
make php
make py
make java
make cs
make cpp
Pour chaque langage, la bibliothèque daff
s'attend à recevoir une interface pour les tables que vous créez, plutôt que de les créer elle-même. Ceci afin d'éviter des copies inefficaces d'un format à un autre. Vous trouverez une classe SimpleTable
que vous pourrez utiliser si vous trouvez cela gênant.
Autres possibilités :
daff
sur http://paulfitz.github.io/daff-doc/ make
for data, avec daff dans le mix. "Puisque git considère les modifications ligne par ligne, examiner les différences de fichiers délimités par des virgules et des tabulations peut devenir désagréable. Le programme daff résout ce problème." daff est distribué sous la licence MIT.