[Algorithme-PERL] Comparaison fichier/BDD svt

Fermé
mcshu - 1 déc. 2006 à 15:05
 mcshu - 4 déc. 2006 à 15:41
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 :

//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:

4 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
1 déc. 2006 à 16:17
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
my %DejaVu; 
my @seulementA;
my (@A,@B);

@DejaVu{@B} = ();

foreach $elem (@A) {
    push(@seulementA, $elem) unless exists $DejaVu{$elem};
}

lami20j
0
Fichier texte =

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.
0
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...
0
Bonjour,

Oui cela m'intéresserait grandement, il vaut mieux 2 solutions que rien.

Merci d'avance.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
4 déc. 2006 à 10:47
Salut,

Je vais voir ça ce soir.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
4 déc. 2006 à 12:17
Le fichier texte tu l'obtiens comment?
Les champs (dans le fichier texte), je parle de la longueur de la sous chaîne, est toujours la même?
0
Je suis désolée, voila :
en nb de caractères
chp 1 : 15
chp 2 : 8
chp 3 : 8
chp 4 : 8
chp 5 : 4
chp 6 : 8
chp 7 : 3
chp 8 : 2
chp 9 : 6
chp 10 : 8
chp 11 : 7
chp 12 : 9
chp 13 : 9

Merci d'avance.
0