[Algorithme-PERL] Comparaison fichier/BDD svt

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 :

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

4 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    1. mcshu
       
      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
  2. emodun
     
    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
    1. mcshu
       
      Bonjour,

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

      Merci d'avance.
      0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Je vais voir ça ce soir.
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    1. mcshu
       
      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