IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Correspondance entre deux tables


Sujet :

Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2015
    Messages : 42
    Points : 15
    Points
    15
    Par défaut Correspondance entre deux tables
    Bonjour à tous,

    Je me tourne vers vous pour demander de l'aide concernant mon problème, où j'essaie de faire correspondre 2 tables qui sont totalement différentes en terme de formalisation des champs (orthographe, ponctuation...) mais qui ont des informations en commun.

    D'ailleurs c'est mon objectif, de faire "matcher les deux bases " en prenant en compte les différences que peuvent exister entre les 2 bases.

    Du coup je vous donne un exemple pour mieux comprendre la difficulté à laquelle je dois faire face :

    Ma première base est une base de données qui recense une très grande majorité de films sous cette forme :

    (IdFilm, Nomfilm, Producteurfilm, OrigineFilm, DatesortieFilm, CategorieFilm....)

    Ainsi à partir de cette première base, j'essaie de faire la jointure avec une autre base mais qui a été faite par quelqu'un d'autre sous un modèle différent.
    Du coup je dois faire en sorte de trouver des champs communs qui pourraient correspondre.

    Un exemple dans ma première base, j'ai le film suivant :

    IdFilm (55)
    NomFilm (Les 3 Mousquetaires)
    ProducteurFilm (Paul W.S. Anderson)
    PaysFilm (Angleterre)
    DatesortieFilm (2011)
    CategorieFilm (Action)

    Dans ma deuxième base le film va ressortir mais avec des informations plus ou moins approximatives,

    IdFilm (AP4178) donc déjà l'id Film de cette base ne pourra pas servir de jointure car ce n'est pas le même
    NomFilm (les trois mousquetaires) orthographe qui est différente
    ProducteurFilm (Paul William Scott Anderson)
    Paysfilm (Angleterre)
    DatesortieFilm (2011)
    CatogieFilm (Action)

    Du coup, le but est de faire correspondre les 2 bases sachant qu'il existe des différences par rapport aux informations qui ont été renseignées, si je devais faire une requête elle devrait être du style,

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select *
    From base1
    Where NomduFilm.base1 like NomduFilm.base2 and ProdcteurFilm.base1 like ProducteurFilm.base2
    Car il y a des différences par rapport à l'orthographe sur le nom du Film, ou celui du Producteur donc je n'aurai jamais un égal, ça serait plutôt le nom du film provenant de la base 1 est contenu dans le nom du film de la base 2.

    Est-ce que c'est possible de faire ce genre de requête ?

    Merci d'avance pour votre aide, et n'hésitez pas à me demander plus de renseignements si vous avez besoin de plus d'informations.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Bonjour.

    En access standard, il n'y a rien qui te permette cela.
    Si tu as acces a SSIS il y a u operateur de comparaison floue (fuzzy) qui permet cela.

    Personnellement j'ai fais truc du genre avec des noms de rue dans des adresses en calculant la "distance" entre deux chaines de caracteres.
    Dans les 2 bases,
    1. Tu remplaces tout ce qui est punctuation par un espace.
    2. Tu remplaces certain mots par leur equivalents (ex : "les trois petits cochons" devient "les 3 petits cochons").
      La function Split et une table de substitutions seront utiles.
    3. Tu elimines tout ce qui n'est pas des lettres ou des chiffres du titre (incluant les espaces)
    4. Tu remplace les lettres accentues par la lettre non accentuee du titre.


    Tu fais cela une fois sur chacune des table pour calculer [TitreEpure] que tu stockes.

    Apres tu calcules la fameuse distance entre les 2 [TitreEpure].

    Ici un article pour Excel :

    Levenshtein Distance in VBA [closed]
    https://stackoverflow.com/questions/...istance-in-vba

    Mais le code devrait marcher directement en Access car ca a l'air de VBA "independent" de l'appli.

    Sinon tu as cela :

    Levenshtein Approximate String Matching
    https://bytes.com/topic/access/insig...tring-matching

    Attention il faut faire cela enregistrement par enregistrement.
    Si tu le fais par requete cela va etre un produit croise : tous les enr. de ta table x tous les enr. de l'autre table.
    Ca peut faire un paquet d'enr et "exploser" Access. Rappel une BD Access ne peut pas depasser 2 Go.

    La solution que j'avais adoptee etait de parcourir en VBA les enregistrements des deux tables avec 2 boucles imbriquees : une sur ma table et une sur la table de "reference".

    Ca donne un truc du genre :

    pour tout les enregistrements de T1

    pour tous les enregistrements de T2

    calculer la distance entre T1 et T2.

    Tu stockes dans la table resultat :
    ClefT1
    ClefT2
    Distance

    Et tu ne gardes que la plus "courte" distance.

    Et tu es PATIENT car le calcul des disatnces peut etre TRES LONG !

    A+

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2015
    Messages : 42
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup pour cette superbe réponse.

    Malheureusement je suis pas un grand spécialiste de VBA ni même access, je vais quand même me pencher sur cette méthode d'appliquer un algorithme qui calcule le nombre de caractère commun entre deux chaînes.

    Si j'arrive à faire ce genre de chose, ça pourrait être très classe.

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Bonjour.

    Ca a l'air plus complexe que cela ne l'est vraiment.

    Si tu veux des details, demande.

    La partie calcul de distance devrait s'utiliser directement avec le code fourni sur https://bytes.com/topic/access/insig...tring-matching.
    Tu ne devrais qu'a avoir a le copier dans un module et t'en servir pas besoin de comprendre la mecanique interne.

    Le reste de la preparation utilises seulement quelques instructions assez communes.

    Une idee qui m'est venu aussi serait d'ajouter une etape de suppression des articles(le, la, les) des titres. Le but est toujours de mininmiser la "distance" initiale entre les titres.

    A+

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2015
    Messages : 42
    Points : 15
    Points
    15
    Par défaut
    Merci pour ton aide,

    Donc pour comparer mes deux chaînes de caractères, il faut déjà que pour chaque chaîne je les regroupes :

    Si on reprend mon exemple cela donne :

    Chaîne 1 (NomFilm, ProducteurFilm, PaysFilm) de ma première base.

    Chaîne 2 (NomFilm, ProducteurFilm, PaysFilm)) de la deuxième base.

    J'imagine que plus je rajoute de champs dans ma chaîne, et plus ça devient compliqué de comparé les deux chaînes, donc je me contente de comparer deux chaînes de caractères composé de 3 champs.

    Ensuite, je dois faire un travail de normalisation sur mes deux chaînes, en remplaçant tous les caractères possibles (',- par un espace) de même que les accents par leur lettre sans accents, et supprimer les articles.

    Concernant cette fonction, elle me renvoi le nombre maximum de caractère commun entre les deux chaînes ?

    Est-ce que tu pourrais me traduire ça, à travers mon exemple ?

    Je te remercie d'avance pour ton aide.

Discussions similaires

  1. Procédure de correspondance entre deux tables
    Par fetano dans le forum PL/SQL
    Réponses: 3
    Dernier message: 29/07/2014, 16h08
  2. Correspondance entre deux tables
    Par hiver dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/02/2014, 15h55
  3. Réponses: 2
    Dernier message: 22/01/2014, 16h53
  4. [AC-2000] Etablir une correspondance entre deux tables et Excel en VBA
    Par Tydher dans le forum VBA Access
    Réponses: 1
    Dernier message: 25/05/2011, 15h31
  5. Verifier datatype correspondance entre deux tables
    Par bolloche dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/05/2009, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo