[Algorithme-PERL] Comparaison fichier/BDD svt
mcshu
-
mcshu -
mcshu -
Bonjour,
Je débute en perl mais je crois que mon souci est plus d'ordre algorithmique.
Mais je souhaite poser ma question, si une âme charitable passe par là ...
J'ai 2 fichiers, enfin presque : j'ai un fichier texte et un recordset Oracle.
Je souhaite faire une comparaison selon certains champs. Comment puis-je ?
Ces 2 sources sont censés avoir le même nombre de lignes mais dans certains cas ce n'est pas le cas.
Le but du script s'est de déterminer les lignes qui manquent d'un côté ou de l'autre.
La comparaison se faisant des 2 côtés, il y aurait 2 fonctions : l'une ->, l'autre <-.
Voila pour la partie fonctionnelle.
J'ai pensé à 2 boucles while imbriquées pour chacune des fonctions qui se composerait comme suite, en langage perl, cela donnerait :
Après cela suppose de faire des comparaisons champ à champ ligne par ligne ???
Est-ce que qqn peut m'aider ?
Merci d'avance.
Je débute en perl mais je crois que mon souci est plus d'ordre algorithmique.
Mais je souhaite poser ma question, si une âme charitable passe par là ...
J'ai 2 fichiers, enfin presque : j'ai un fichier texte et un recordset Oracle.
Je souhaite faire une comparaison selon certains champs. Comment puis-je ?
Ces 2 sources sont censés avoir le même nombre de lignes mais dans certains cas ce n'est pas le cas.
Le but du script s'est de déterminer les lignes qui manquent d'un côté ou de l'autre.
La comparaison se faisant des 2 côtés, il y aurait 2 fonctions : l'une ->, l'autre <-.
Voila pour la partie fonctionnelle.
J'ai pensé à 2 boucles while imbriquées pour chacune des fonctions qui se composerait comme suite, en langage perl, cela donnerait :
//Exécution SQL $sth = $dbh->prepare("SELECT * FROM TABLE WHERE ..."); $sth->execute(); //Fichier Texte open($FIC, "fichier.txt"); while ($lignes = <$FIC>){ // champs $champ1 = substr($lignes, 0,8); $champ2 = ...; ... while($rs = $sth->fetchrow_hashref(){ // champs ${"tabhash_champs$i"}{cle1} = substr($rs, 0, 8); ... // Affectation d'un tableau de hashage $tab_lignesMVS[$i] = \%{"tabhash_champs$i"}; } }
Après cela suppose de faire des comparaisons champ à champ ligne par ligne ???
Est-ce que qqn peut m'aider ?
Merci d'avance.
A voir également:
- [Algorithme-PERL] Comparaison fichier/BDD svt
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
4 réponses
Salut,
Le but du script s'est de déterminer les lignes qui manquent d'un côté ou de l'autre.
J'ai besoin de la structure de ton texte et aussi de quels champs tu parles.
Soit plus concret. Merci.
D'après ce que je vois tu veux comparrer les premiers 8 caractères (je suppose que c'est le champ).
Tu peux par exemple utiliser 2 tableaux qui sont en fait les clés de 2 hash et de chercher les éléments qui sont dans un et pas dans l'autre.
Voilà un code générique
lami20j
Le but du script s'est de déterminer les lignes qui manquent d'un côté ou de l'autre.
J'ai besoin de la structure de ton texte et aussi de quels champs tu parles.
Soit plus concret. Merci.
D'après ce que je vois tu veux comparrer les premiers 8 caractères (je suppose que c'est le champ).
Tu peux par exemple utiliser 2 tableaux qui sont en fait les clés de 2 hash et de chercher les éléments qui sont dans un et pas dans l'autre.
Voilà un code générique
my %DejaVu; my @seulementA; my (@A,@B); @DejaVu{@B} = (); foreach $elem (@A) { push(@seulementA, $elem) unless exists $DejaVu{$elem}; }
lami20j
je ne sais pasn si t'es obligé de faire la comparaison avec un scrip perl... en tout ca moi je peux te proposer un script trés simple et trés court en shel unix...
COMPARAISON 0102B000AM102B2Z2100180200601011000208XX201006000000000045102000000003000000003
COMPARAISON 0102B000AM102B2Z2100180200601011000208XX201006000000000144102000000003000000003
COMPARAISON 0102B000AM102B2Z2100180200601011000208XX201006000000000182102000000003000000003
COMPARAISON 0102B000AM102B2Z2100180200601011000208XX201006000000009487102000000003000000003
COMPARAISON 0102B000AM102B2Z2100180200601011000208XX201006000000009781102000000003000000003
délimité comme ceci :
chp 1 : COMPARAISON
chp 2 : 0102B000
chp 3 : AM102B2
chp 4 : Z2100180
chp 5 : 2006
chp 6 : 01011000
chp 7 : 208
chp 8 : XX
chp 9 : 201006
chp 10 : 00000000
chp 11 : 0045102
chp 12 : 000000003
chp 13 : 000000003
Cela t'aidera-t-il mieux à me répondre ?
Dans la base Oracle, il y les chps 2 --> 13.
Merci d'avance.