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