Bonjour à tous,
Avant tout je suis débutant et j'utilise VBA et MS Access dans le cadre d'une these en management de projet.

Mon code ne fait pas ce que je souhaite et si vous acceptiez de m'aider je vous en serais tres reconnaissant.

A/ Objectif initial :
Dans le cadre d'une recherche doctorale, je recupere un corpus d'articles scientifiques (30 000 au total) qui me sont envoyé par un automate sous forme d'emails. Les informations que je souhaitent récuperer sont contenus dans le corps de message et structurées ainsi :

- exemple d'email :

Donnée: 45

Titre:
A COLLABORATIVE SOFTWARE CODE INSPECTION:: THE DESIGN AND EVALUATION OF A REPEATABLE COLLABORATION PROCESS IN THE FIELD.

Auteurs:
DE VREEDE, GERT-JAN1,2 gdevreede@mail.unomaha.edu KONERI, PUSHPA G.2 pkoneri@mail.unomaha.edu DEAN, DOUGLAS L.3 doug_dean@byu.edu FRUHLING, ANN L.2 afruhling@mail.unomaha.edu WOLCOTT, PETER2 pwolcott@mail.unomaha.edu

Source:
International Journal of Cooperative Information Systems; Jun2006, Vol.
15 Issue 2, p205-228, 24p, 8 charts, 3 diagrams

Type de document:
Article

Termes du sujet:
*RESEARCH
*COMPUTER software -- Development
*COMPUTER software -- Quality control
*COMPUTER industry
*COMPUTER systems
COMPUTER users

Author-Supplied Keywords:
action research
code inspection
Collaboration
Collaboration Engineering
Fagan inspection
Group Support Systems
thinkLets

Code industrie/NAICS:
NAICS/Industry Codes 334111 Electronic Computer Manufacturing 443120 Computer and Software Stores
541512 Computer Systems Design Services


fin de l'exemple :

Je cherche donc à récupérer dans une base MS Access 2003 ces données.

Pour ce faire j'utilise 4 tables :

1) Email est la table qui contient tous les emails directement importé d'Outlook

2) tbInfos est la table dans laquelle je souhaite collecter les informations generales
exemple: Le titre de l'article, son identifiant, son type ...

3) tbAuteurs est latable dans laquelle je souhaite collecter les auteurs car un article peut avoir un ou plusieurs auteurs, aussi cette table sera liée à la table tbInfos par l'identifiant article

4)tbMotsClefs dans laquelle je souhaite collecter les mots clefs que l'auteur a indiquer pour identifier son article. C'est la liste précédée d'un * qui suit l'identifiant Termes du sujet: dans l'exemple. Sur le meme principe que pour les auteurs les mots clefs seront reliés à la table tbInfos


B/ La methode choisie:
Apres recherches il me semble que l'emploie des expressions regulières
(j'ai utilisé le tuto : http://cafeine.developpez.com/access/tutoriel/regexp/)
semble bien adapté.

Mon idée est de passer chaque ligne de la table email par une fonction visant a récupérer les données identifiées.


C/ Le code réalisé :


- j'utilise une fonction récupérée et legerement adapté dans le tuto cité plus haut :

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Public Function DecoupageRegExpInitial(ByVal strSource As String, _
                   ByVal strPattern As String, _
                   ByVal strReplace As String)
 
    ' déclarations du recordset permettant l'ajout des données dans la table tbInfos
    Dim RsInfos As DAO.Recordset
    ' instanciation du recordset
    Set RsInfos = CurrentDb.OpenRecordset("tbInfos")
 
    ' déclaration des objets RegExp
    Dim reg As VBScript_RegExp_55.RegExp
    Dim Match As VBScript_RegExp_55.Match
    Dim Matches As VBScript_RegExp_55.MatchCollection
 
    ' instanciation
    Set reg = New VBScript_RegExp_55.RegExp
 
    ' attribution des propriétés
    ' ''' motif / pattern qui nous est envoyé par une autre procedure
    reg.Pattern = strPattern
    ' ''' application sur toutes les occurences
    reg.Global = True
    ' ''' nous n'ignorons pas la casse
    reg.IgnoreCase = True
    ' ''' le motif porte sur plus d'une ligne à la fois
    reg.Multiline = True
 
    ' Utilisation de .Execute
    '   pour parcourir la liste des motifs correspondants
    '                .Matches
    '                .SubMatches
    Set Matches = reg.Execute(strSource)
    For Each Match In Matches
     '   Debug.Print "source >>", Match.Value
        'For i = 0 To Match.SubMatches.Count - 1
        '   Debug.Print "[$" & i + 1 & "]", Match.SubMatches(i)
        'Next i
 
        With RsInfos
        .AddNew
        !Donnée = Match.SubMatches(0)
        !Titre = Match.SubMatches(1)
'       !Auteurs = stAuteur
        !Source = Match.SubMatches(3)
        !Typedocument = Match.SubMatches(4)
'pour l'instant ces autres informations ne sont pas identifiable avec le pattern fournis
'mais ce n'est pas là que je bloque
'        !Termessujet = stTermes
'        !Resume = stResume
'        !Affiliationauteur = "essai"
'        !ISSN = stISSN
'        !Numeroaccs = stAccs
'        !permalien = stPermalien
'        !Coupercoller = "non dispo"
'        !Basededonnées = "EBSCO"
'        !Corpus = "test"
 
        End With
     RsInfos.Update
     RsInfos.Close
   Next Match
End Function
- Voici la procedure mere que je declenche d'un clic sur un boutton :


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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Private Sub btnTestRecupBtnInfos_Click()
'L'objectif est ici  de récupérer à l'aide de la fontcion DecoupageRegExpIntial(ByVal strSource As String, ByVal strPattern As String, ByVal strReplace As String)
'les informations générales disponibles dans chaque email
'et de les ranger dans une table tbInfos
'Grâce à l'identifiant de l'article
'nous pourrons ranger tous les mots clefs et les auteurs, dans deux autres tables, respectivement tbMotsClefs et tbAuteurs.
 
'Pour memoire la fonction :
'DecoupageRegExpInitial(ByVal strSource As String, ByVal strPattern As String, ByVal strReplace As String)
'attend :
'la chaine source strSource qui sera a analyser, ici le corps de l'email que nous recuperons dans le champ Corps
'la chaine du Pattern strPattern qui indique la structure des données et les parties que l'on souhaite récupérer entre paretheses
'la chaine de remplacement strReplace que nous n'utilisons pas pour le moment sert dans la fonction a effectuer des remplacements
'_____________________________________________________________________________________________________
'1) La chaine source :
'-----------------------------------------------------------------------------------------------------
'Nous allons chercher la chaine source en parcourant la table des emails
'et en récuperant le contenu du champ Corps
 
'Declaration du recordset
Dim t As DAO.Recordset ' lien vers les emails à découper
Set t = CurrentDb.OpenRecordset("reqMail")
 
'reqMail est une requete qui reprend la table Email et nous permet de limiter le nombre d'enregistrement pour des essais
 
 
Dim s As String ' s est la chaine du contenu de l'email que l'on va renvoyer vers les fonctions
                'de reconnaissance d'expressions regulieres, pour commencer DecoupageRegExpInitial
 
Dim stPattern As String 'stPattern est la chaine qui definit l'expression reguliere
                        'ou plus exactement sa structure
 
'On attribue a StPattern le motif qui identifie les informations generales
 
stPattern = "Donnée: (.*)\r\n\r\nTitre:\r\n(.*)\r\n\r\nAuteurs:\r\n(.*)\r\n\r\nSource:\r\n(.*)\r\n\r\nType de document:\r\n(.*)\r\n\r\n"
 
'On indique le début du traitement par une boite de dialogue
MsgBox ("Début du traitement !")
 
Do Until t.EOF 'on parcourt l'integralité de la requette contenant les emails jusqu'au dernier enregistrement
  s = Trim(t!Corps)
  DecoupageRegExpInitial s, stPattern, ""
  'Pour chaque enregistrement on lance la fonctionDecoupage RegExpInitial sur le champ Corps
 
    If Not t.EOF Then 'Si nous n'avons pas atteind la fin du fichier on peut passer à l'enregistrement suivant
    t.MoveNext
 
    End If 'sinon fin de la bouble
Loop
 
MsgBox ("Fin du traitement !")
 
End Sub


D/ Le probleme rencontré:

Pour le moment je ne recupere que les infos generales. Je pense que si je parviens a maitriser cela, je pourrrai me débrouiller pour les mots clefs et les auteurs ( encore que ...).
Le code s'execute bien.
J'obtiens dans ma table tbInfos les bonnes données dans les bons champs,
mais en revanche un meme article va occuper (avec les memes données) plusieurs enregistrements, 3, 2 ou plus ligne dans la table.
QUelqu'un comprend il ce qui se passe et ce que je dois changer dans le code ?

Merci d'avance si vous avez eu le courage de tout lire et envie de m'aider.

Charles