Comparaison de fichiers - choix langage de programmation
Le
Tittom
Bonjour,
J'ai besoin d'un outil de comparaison de fichiers, mais ces besoins
étant très spécifiques et précis, je n'ai pas trouvé mon bonheur
parmis les outils existants que j'ai trouvé, aussi je pense créer le
mien.
(Pour les curieux qui voudraient voir un exemple de ce que j'attends de
mon outil, c'est consultable en bas de la page suivante :
http://www.tittom.net/developpement/CompareFiles/ )
Jusqu'à présent, j'ai prototypé un truc qui marche pas mal du tout,
avec l'aide de :
- awk pour la routine de comparaison
- sort pour trier les fichiers selon les clés
- du shell pour encapsuler et enchaîner tout ça
Je n'ai pas une large connaissance des outils de développement unix,
aussi j'ai peur d'en arriver à utiliser une fourchette pour couper du
pain, ou un char d'assaut pour écraser un moustique, si vous voyez ce
que je veux dire :)
J'aimerais donc avoir des conseils quant au langage de développement
à utiliser (perl ? c ? shell ? autres ?), alors j'indique ci-dessous
les caractéristiques "cible" de mon outil.
- Comparaison de 2 fichiers texte au format CSV (ou assimilé, bref des
champs séparés par un caractère)
- Les fichiers en question peuvent avoir + de 5000 caractères par
ligne
- Les fichiers en question sont de l'ordre de 10Mo, exceptionnellement
50 ou 100Mo.
- Le principe de comparaison se rapproche d'une comparaison de tables
de bases de données : rapprochement d'enregistrements par comparaison
de clés, puis comparaison zone à zone des enregistrement communs
entre les 2 fichiers
- Production d'un rapport détaillé (format HTML ou CSV au choix)
explicitant quels écarts ont été rencontrés
- Possibilité d'ignorer certaines zones dans la comparaison, mais tout
en les affichant dans le rapport final.
Voilou, merci pour vos avis critiques !
--
Tittom
J'ai besoin d'un outil de comparaison de fichiers, mais ces besoins
étant très spécifiques et précis, je n'ai pas trouvé mon bonheur
parmis les outils existants que j'ai trouvé, aussi je pense créer le
mien.
(Pour les curieux qui voudraient voir un exemple de ce que j'attends de
mon outil, c'est consultable en bas de la page suivante :
http://www.tittom.net/developpement/CompareFiles/ )
Jusqu'à présent, j'ai prototypé un truc qui marche pas mal du tout,
avec l'aide de :
- awk pour la routine de comparaison
- sort pour trier les fichiers selon les clés
- du shell pour encapsuler et enchaîner tout ça
Je n'ai pas une large connaissance des outils de développement unix,
aussi j'ai peur d'en arriver à utiliser une fourchette pour couper du
pain, ou un char d'assaut pour écraser un moustique, si vous voyez ce
que je veux dire :)
J'aimerais donc avoir des conseils quant au langage de développement
à utiliser (perl ? c ? shell ? autres ?), alors j'indique ci-dessous
les caractéristiques "cible" de mon outil.
- Comparaison de 2 fichiers texte au format CSV (ou assimilé, bref des
champs séparés par un caractère)
- Les fichiers en question peuvent avoir + de 5000 caractères par
ligne
- Les fichiers en question sont de l'ordre de 10Mo, exceptionnellement
50 ou 100Mo.
- Le principe de comparaison se rapproche d'une comparaison de tables
de bases de données : rapprochement d'enregistrements par comparaison
de clés, puis comparaison zone à zone des enregistrement communs
entre les 2 fichiers
- Production d'un rapport détaillé (format HTML ou CSV au choix)
explicitant quels écarts ont été rencontrés
- Possibilité d'ignorer certaines zones dans la comparaison, mais tout
en les affichant dans le rapport final.
Voilou, merci pour vos avis critiques !
--
Tittom

Poser une question


Perl me semble tout à fait adapté.
Dans tous les cas, il va falloir programmer pas mal pour permettre à
l'utilisateur de saisir ses critères.
Ok, peux-tu m'indiquer s'il te semble mieux adapté que awk et pourquoi
? Je voudrais être sûr de comprendre pourquoi l'un serait mieux
adapté que l'autre, ou inversement :)
J'ai oublié de préciser que mon outil s'utilise en ligne de commande,
les critères seront définis dans des fichiers de configuration. C'est
du pur mode batch, l'objectif étant de faire comparer les fichiers par
la machine la nuit, pour analyser les résultats le jour.
Merci pour ta réponse.
awk est extrêmement optimisé pour la tâche particulière de filtrage de
fichier ligne par ligne, et ça se ressent au niveau des structures de
contrôle, et des possibilités d'interaction explicite avec le système.
D'autre part, les structures de données sont plus limitées, en particulier
par l'absence d'un équivalent des références de perl.
Même comme ça, il faut une syntaxe pour décrire les critères, et un
interpréteur pour cette syntaxe : ça ne se fera pas tout seul, à moins
d'utiliser l'interpréteur du langage lui-même.
Perso, je n'utiliserais pas C (trop de développement) ni le shell sinon
pour servir de glu entre 2 ou 3 programmes (probablement trop coûteux
en ressources et pas vraiment adapté).
J'utiliserais un langage de script comme Ruby, je dis ça parce que
j'aime bien Ruby mais on doit faire la même chose en Perl.
Je ne connais pas assez awk pour juger, mais il me semble peu adapté, il
est principalement basé sur les expressions régulières et il n'est pas
évident que tu en aies beaucoup besoin. Un langage de script comme Ruby
et Perl donnerait plus de souplesse.
N'oublie pas de regarder la commande 'uniq', ça pourrait te servir.
Comme tu l'as remarqué, le problème peut être résolu par l'algèbre
relationnelle, créer des tables SQL serait peut-être un peu
marteau-pilon, mais regarde :
http://www.linux.it/~carlos/nosql/current-doc/NoSQL.html
Ca pourrait être une solution.
--
http://patrick.davalan.free.fr/
Quand tu dis que "ça se ressent", c'est que les structures de
contrôle et possibilités d'interaction explicite avec le système
risquent d'induire des pb de perf, alors que ce n'est pas le cas en
perl ?
Ca ne devrait pas me gêner beaucoup, j'ai principalement des chaines
alphanumériques.
Mais c'est une souplesse à prendre en compte en effet !
Je sens que je vais me mettre à perl :)
Je pensais imposer une forme de ce type dans les fichiers de
configuration :
# liste des zones clé
zone1;zone2;zone3
# liste des zones à ne pas comparer
zone8;zone5
C'est à peu près tout ce dont j'ai besoin. Bref cette partie là ne
m'inquiète pas trop.
Merci encore pour tes lumières.