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

VBA Access Discussion :

extraction de chaine dans emails outlook 2003


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Par défaut extraction de chaine dans emails outlook 2003
    Bonjour,
    Dans le cadre d’une étude bibliométrique je cherche a récupérer des informations concernant des articles scientifiques contenues dans des emails. Je dois traiter environ 30 000 emails et c’est pourquoi je cherche à automatiser les traitements.

    J’ai simplement exporté mes emails de outlook 2003 vers Access 2003.

    Chaque email contient dans son corps des informations structurées comme ci-dessous :
    ------------------------------------------------------------------------------------------------------------
    Donnée: 2

    Titre:
    `Multitrack' Your Way To The Top.

    Auteurs:
    Lewis, Brian J.

    Source:
    Journal of Management in Engineering; May/Jun99, Vol. 15 Issue 3, p8, 2p

    Type de document:
    Article

    Termes du sujet:
    *JOB hunting
    *EMPLOYMENT (Economic theory)

    Résumé:
    Focuses on mutitrackers, employees with multiple job experience. Effect
    of globalization on employees; Key reaching the top; How search firms
    value job positions.

    ISSN:
    0742-597X

    Numéro d'accs:
    1836791

    Lien permanent vers cet enregistrement (permalien):
    http://search.ebscohost.com/login.as...AN=1836791&amp
    ;lang=fr&site=ehost-live
    Couper et coller : <A
    href="http://search.ebscohost.com/login.aspx?direct=true&db=bth&AN=18367
    91&amp;lang=fr&site=ehost-live">`Multitrack' Your Way To The Top.</A>

    Base de données:
    Business Source Complete
    Les informations de lien ci-dessus proposent un lien permanent à
    l'article que vous avez demandé.

    Lien permanent à cette donnée : cliquez sur le lien ci-dessus pour aller
    au début de l'article ou de la citation.

    Couper et coller : pour placer les liens d'articles dans un document Web
    externe, il suffit de copier et coller le code HTML ci-dessus, à partir
    de la balise « <A HREF »

    En cas de problème ou si vous avez des questions, contactez l'Assistance
    technique à l'adresse http://support.epnet.com/contact/askus.php ou
    appelez le 800-758-5995.

    Cet e-mail a été généré par un utilisateur d'EBSCOhost ayant accès au
    compte ESC LILLE . Ni EBSCO ni ESC LILLE ne sont responsables du contenu
    de cet e-mail.
    -----------------------------------------------------------------------------------------------------------------
    je cherche a récuperer dans une table les informations :

    Donnée :
    Titre :
    Auteur :
    Source :
    ……

    J’ai fait des essais à partir de l’editeur de requête d’access en utilisant les fonctions
    DansChaine pour trouver la position des mots balise comme Titre: et Auteur:
    Puis la fonction ExtracChaîne
    L’ensemble du message se trouvant dans le champ [Corps]

    Cela donne par exemple pour extraire la valeur de Auteur

    PosAuteur: DansChaîne(SupprEspace([Corps]);"Auteurs:")+8

    PosSource: DansChaîne(SupprEspace([Corps]);"Source:")-2

    Auteur: SupprEspace(ExtracChaîne([Corps];[PosAuteur];[PosSource]))

    Je pensais construire ainsi la décomposition du champs corps et grâce a une requête mise a jour, remplir une table avec les valeurs intéressantes pour les traitements ultérieurs à faire sur ces données. Le resultat que j’obtiens n’est cependant pas probant, puisque dans cette j’obtiens pour

    PosAuteur : 69
    PosSource : 99
    Auteur :

    Lewis, Brian J.

    Source:
    Journal of Management in Engineering; May/Jun99, Vol. 15 I

    Quelqu’un saurait t il m’expliquer mon erreur de raisonnement ?
    Quelqu’un aurait t il une approche plus efficace de l’extraction de ces données.

    Merci d’avance de votre aide.
    Charles

  2. #2
    Membre Expert
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Par défaut
    Il faut simplement lire le mail et récupérer les données comme ceci
    les mails sont contenus dans la tables mails, un champ n NuméroAuto est nécessaire pour récupérer les données dans l'ordre

    donc table Mails (ligne, n)
    créer une requete reqMails qui permettra de lire les lignes dans l'ordre avec le code sql suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT Mails.ligne, Mails.n FROM Mails ORDER BY Mails.n;
    créer le code suivant pour récupérer les données dans une table tbInfos par exemple contenant autant de champs que de données à récupérer
    tbInfos (titre, auteurs, source, resume)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Sub RecuperationMails()
     Dim t As DAO.Recordset, t2 As DAO.recorset, s As String
     
     Set t = CurrentDb.OpenRecordset("reqMails")
     Set t2 = CurrentDb.OpenRecordset("tbInfos")
     Do Until t.EOF
      s = Trim$(t!ligne)
      Select Case s
      Case "Titre:"
       If Not t.EOF Then t.MoveNext: t2.addnew:t2!titre = Trim$(t!ligne)
      Case "Auteurs:"
       If Not t.EOF Then t.MoveNext: t2!Auteurs = Trim$(t!ligne)
      Case "Source:"
       If Not t.EOF Then t.MoveNext: t2!Source = Trim$(t!ligne)
      Case "Résumé:"
       If Not t.EOF Then t.MoveNext: t2!resume = Trim$(t!ligne):t2.update
      End Select
      t.MoveNext
     Loop
     t.Close: t2.Close
     
    End Sub
    Il faut ajouter la référence Microsoft DAO ...

    ceci est un exemple à adapter

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Par défaut progres dans la maitrise de Mid et InStr - mais comment utiliser ceci dans un code vba ?
    J'ai déjà compris une partie du probleme et apporte donc des precisions qui pourront peut être servir à d'autres débutants ayant besoin de manipuler des cahînes de carateres.

    la fonction ExtracChaîne ou Mid

    fonctionne de la maniere suivante :

    ExtracChaîne([champ ou chaine de laquelle nous allons extraire];[Position dans la chaine du debut de l'extraction];[Nb de caracteres à extraire])

    je faisais donc une erreur en utilisant comme derniere argument la position de la fin de l'extraction.
    Il faut donc recuperer la taille de la chaine a extraire.

    Ainsi en reprenant l'exemple du precedant post :

    on definit la position des delimitateurs :
    PosDonne : DansChaîne(1;[Corps];":")+1
    'l'argument 1 indique où commence la recherche, ici au 1er caracter de [Corps], on recherche le 2eme argument : soit la premiere apparition de : a partir du premier caractere. J'ai ajouté +1, pour recuperer la position apres ce delimateur.
    De la meme façon, nous definissions :
    PosTitre : DansChaîne([PosDonne];[Corps];":")-6
    1er argument [PosDonne], pour poursuivre la recherche des :
    La formule se termine par - 6 pour se positionner avant Titre: qui fait 6 caracteres.
    Il nous faut egalement definir la taille de la chaine Donnee. On utilise pour cela l'arithmetique traditionnelle.

    TaiDonne: (([PosTitre])-([PosDonne]+1))-3
    le - 3 semble parvenir a eliminer les sauts de ligne.

    On extrait maintenant la valeur de la chaine qui nous interesse, ici Donnée:

    Donnee:ExtracChaîne([Corps];[PosDonne]+1;[TaiDonnee])


    voila un exemple tres concret, pas à pas d'utilisation de ExtracChaîne et DansChaine.
    En vba ces fonctions sont respectivement Mid et InStr je crois.
    J'espere que cela pourra etre utile a quelqu'un.

    J'ai cependant encore besoin d'aide.
    Comment eviter l'editeur de requete et transposer tout cela dans un code vba qui parcourait la table Email et pour chaque email isolerait les données pour par exemple les passer dans une autre table ?
    Si quelqu'un peut m'aider je lui serai tres reconnaissant.

    L'ideal serait d'ailleurs d'utiliser directement ce code dans MS outlook 2003
    Pour que par une regle, à l'arriver des messages je puisse remplire les champs d'une table.

    Merci d'avance.

  4. #4
    Membre Expert
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Par défaut
    on peut éclater le corps en lignes comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Sub CorpsDansMails()
     Dim t As DAO.Recordset, t2 As DAO.Recordset, corps As String, ligne() As String, i As Long, n As Long
     
     DoCmd.RunSQL "DELETE Mails.* FROM Mails;"
     Set t = CurrentDb.OpenRecordset("Corps")
     Set t2 = CurrentDb.OpenRecordset("Mails")
     Do Until t.EOF
      ligne = Split(t!corps, vbCrLf)
      n = UBound(ligne)          'nombre de lignes
      For i = 1 To n             'enregistrement de chaques lignes
       t2.AddNew
       t2!ligne = ligne(i)
       t2.Update
      Next i
      t.MoveNext
     Loop
     t.Close: t2.Close
    End Sub

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Par défaut Mais quid de la coherence par email
    La solution pour decomposer les corps d'emails en ligne d'enregistrement me parait efficace. Cependant, comment conserve-t-on la coherence des enregistrement par email in fine.

    car les emails saucissonés, on va par la methode addNew indiquée dans votre premier post ce matin ajoutée toutes les lignes à une table ? mais on souhaiterait les récupéré (horizontalement) en enregistrement.

    Ou est ce que quelque chose m'echappe a nouveau ?

  6. #6
    Membre Expert
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Par défaut
    on peut récupérer ce qui est entre 2 balises, j'entends ici balise un mot clef qui définit le début ou un mot clef qui définit la fin du texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Sub Mails()
     Dim t As DAO.Recordset, t2 As DAO.Recordset, s As String, n1 As Long, n2 As Long
     
     DoCmd.RunSQL "DELETE Mails.* FROM Mails;"
     Set t = CurrentDb.OpenRecordset("Corps")
     Set t2 = CurrentDb.OpenRecordset("Mails")
     Do Until t.EOF
      s = Trim$(t!corps)
      t2.AddNew
     
      n1 = InStr(1, s, "Titre:") + 8
      n2 = InStr(n1 + 1, s, "Auteurs:")
      t2!titre = Mid$(s, n1, n2 - n1 - 3)
     
      n1 = InStr(1, s, "Auteurs:") + 10
      n2 = InStr(n1 + 1, s, "Source:") - 2
      t2!auteurs = Mid$(s, n1, n2 - n1 - 3)
     
      n1 = InStr(1, s, "Source:") + 9
      n2 = InStr(n1 + 1, s, "Type de document:")
      t2!Source = Mid$(s, n1, n2 - n1 - 3)
     
      n1 = InStr(1, s, "Résumé:") + 9
      n2 = InStr(n1 + 1, s, "ISSN:")
      t2!resume = Mid$(s, n1, n2 - n1 - 3)
     
      t2.Update
      t.MoveNext
     Loop
     t.Close: t2.Close
     
    End Sub

  7. #7
    Expert confirmé
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Par défaut
    Hello,

    on peut aussi utiliser les RegExp qui sont les meilleurs outils pour ce type de besoin.
    http://cafeine.developpez.com/access/tutoriel/regexp/
    avec par exemple un pattern de ce type

Discussions similaires

  1. Cryptage Email + Outlook 2003
    Par hugo69 dans le forum Sécurité
    Réponses: 3
    Dernier message: 02/04/2009, 23h00
  2. Extraction de chaine dans une variable (vbs) ?
    Par liocifer dans le forum VBScript
    Réponses: 2
    Dernier message: 22/05/2008, 20h30
  3. msn.com dans Office Outlook 2003
    Par snoopy80 dans le forum Outlook
    Réponses: 1
    Dernier message: 29/06/2007, 07h37
  4. Extraction de chaine dans un fichier
    Par Sakapatate dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 31/05/2007, 21h13
  5. Réponses: 2
    Dernier message: 06/02/2007, 10h29

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