Bonjour à toutes et à tous,
Je souhaiterais de l'aide pour une méthode, car je n'ai plus beaucoup d'idées pour attaquer le problème, pour cette raison que je me tourne vers vous.
Ce problème est de récupérer des variables, sachant que leurs noms peuvent être identique mais pas la casse. Quand j'extrait tout dans un Dictionary, celà ne pose pas de problème, car les clés ne tiennent pas compte de la casse.
Par contre, je me sers du nom des clés pour automatisé la création de mes checkboxs, et dans le nom que se soit "yf" ou "YF" il n' y a aucune différence, donc problème en vue.
Le problème est que la propriété nom (.Name) des checksBoxs ne fait pas la différence entre "yf" et "YF" qui ont tous deux des désignations différentes.Déroulement du code :
Je vais détailler les étapes du programme pour vous donner une idée global de son fonctionnement :
- Tout d'abord, il faut ouvrit un explorer via un bouton, afin de sélectionner un fichier en .rtf (format du rapport)
- Le programme se charge de convertir le fichier .rtf en fichier texte .txt
- Une fois le fichier texte créé, le programme l'ouvre dans un streamreader qui récupère la globalité du fichier (soit 800 lignes ~)
- Les données du streamreader sont stockées dans une variable "String" pour ensuite, avec une RegEx, récupérer les lignes clés dans une collection.
- La collection est testée avec d'autres motifs de RegEx, afin de récupérer la désignation des variables et leurs valeurs numériques.
- Le programme stocke les données de chaques lignes dans un "Dictionary" (la clé étant la désignation, et la valeur de celle-ci la valeurs numériques.
- Une fois toutes les données rentrées dans le "Dictionary", je réalise les checkboxs automatiquement, le nom de chaque checkbox étant "CheckBoxName_" et la clé du "Dictionary" (se qui donne par exemple "CheckBoxName_yf"). Les checkboxs permettent à l'utilisateur de sélectionner les variables à retenir, pour sortir leur valeurs sous format Excel.
Au début je testais les clés dans mon "Dictionary" en forçant tout en ".ToUpper" et quand une clés est déjà présente je rajoute derrière la clé "_1" (ainsi de suite). Au début s'était suffisant, mais maintenant moi même ne sais plus la différence entre les variables YF et YF_1...
Voici le code pour l'extraction des variables et la création des checkboxs :
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 Public Dictionnaire as Dictionary (Of String, Object) Private Sub ExempleDeMonCode(ByVal fichierChemin As String) Dim objStreamReader As StreamReader 'Variable pour StreamReader Dim TailleFichier As Integer 'récupération de la taille du fichier pour la ProgressBar '---------------------- Test ouverture fichier .txt --------------------- 'Essai d'ouvrir le fichier .txt car il y a de la latence entre la fermeture de word et l'ouverture du fichier .txt '(physique lier au processeur), alors que via le StreamReader aucun latence, problème 'Donc temps qu'on ne peut pas ouvrir le fichier on est dans la boucle, en attendant que le word rend la main sur le .txt Do FSIsOk = OuvertureExclusive(fichierChemin) Loop Until FSIsOk = True InitialisationProgramme() 'Initialise une partie des varaibles 'MsgBox(FSIsOk) 'MsgBox(ouvrirChemin) '------------------------------ StreamReader ---------------------------- 'Ouvrir le fichier dans StreamReader. objStreamReader = New StreamReader(ouvrirChemin, System.Text.Encoding.Unicode) 'MsgBox(objStreamReader) TailleFichier = objStreamReader.BaseStream.Length Dim fichierComplet As String fichierComplet = objStreamReader.ReadToEnd objStreamReader.BaseStream.Seek(0, 0) objStreamReader.Close() Dim pattern As String = "\s([\w\)\(\/\.\°\,\-\*\'\²\³\ ]*)\[{1}([\w\'\,\°\-\+\*\.\=\-\/²]*)\]{1} *([\-\(A]?" & _ "[\d+\.?]+ {0,2}[\-?\,?\/?\(?\)?]* {0,2}[\-\(A]?[\d+\.?]* {0,2}[\/?m*s?N?k?W?\)?]* {0,2}?) *([\-\(A]?[\d+\.?]*" & _ " {0,2}[\-?\,?\/?\(?\)?]* {0,2}[\-\(A]?[\d+\.?]* {0,2}[\/?m*s?N?k?W?\)?]* {0,2}?)? *([\-\(A]?[\d+\.?]* {0,2}" & _ "[\-?\,?\/?\(?\)?]* {0,2}[\-\(A]?[\d+\.?]* {0,2}[\/?m*s?N?k?W?\)?]* {0,2}?)?\s" Dim retourPrincipal As MatchCollection retourPrincipal = Regex.Matches(fichierComplet, pattern) For Each m As Match In retourPrincipal Dim j As Integer j += 1 Dim i As Integer = 1 Dim nomVariable As String nomVariable = m.Groups(2).Value For i = 1 To i For k = 0 To Dictionnaire.Count - 1 'MsgBox(nomVariable.ToUpper & vbNewLine & Dictionnaire.Keys(k).ToUpper) If nomVariable.ToUpper = CStr(Dictionnaire.Keys(k).ToUpper) Then If InStr(nomVariable, "_") Then nomVariable = Mid(nomVariable, 1, InStr(nomVariable, "_")) & i k = 0 Else nomVariable = nomVariable & "_" & i k = 0 End If i += 1 End If Next Next If IsNothing(Replace(m.Groups(4).Value, " ", "")) And IsNothing(Replace(m.Groups(5).Value, " ", "")) Then Dictionnaire.Add(nomVariable, m.Groups(3).Value) ElseIf Not IsNothing(Replace(m.Groups(4).Value, " ", "")) And IsNothing(Replace(m.Groups(5).Value, " ", "")) Then Dictionnaire.Add(nomVariable, m.Groups(3).Value) ElseIf IsNothing(Replace(m.Groups(4).Value, " ", "")) And IsNothing(Replace(m.Groups(5).Value, " ", "")) And _ IsNothing(Replace(nomVariable, " ", "")) Then Dictionnaire.Add(nomVariable, "Pas de valeurs") Else Dictionnaire.Add(nomVariable, m.Groups(3).Value) End If ApplicationMenu.PGB_PROGRESSION.Value = 100 * j / retourPrincipal.Count ApplicationMenu.LBL_PROGRESSION.Text = "Lecture encours ..." Next ApplicationMenu.LBL_PROGRESSION.Text = "Lecture terminée" ApplicationMenu.LBL_VariablesRecup.Text = Dictionnaire.Count CreationCheckBoxs() End Sub
J'ai vu que l'on peut déclarer un "Dictionary" dans un autre, est ce une solution, ou je vais droit dans le mur ? Existe t'il d'autres méthodes ou cas qui peuvent résoudre se problème ?
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 Private Sub CreationCheckBoxs() Dim x As Integer = 5 Dim y As Integer = 5 Dim checkBoxName As String For Each ctrl In Parametres.Panel1.Controls If TypeOf ctrl Is CheckBox Then Parametres.Panel1.Controls.Remove(ctrl) End If Next For i = 0 To Dictionnaire.Count -1 ReDim Preserve a(i) a(i) = New CheckBox With a(i) Parametres.Panel1.Controls.Add(a(i)) checkBoxName = "checkBox_" & Dictionnaire.Keys(i) .Text = Dictionnaire.Keys(i) .Checked = True .Left = x .Top = y y = y + 20 .Width = 100 'Definit la largeur de l'objet .Height = 20 'Definit la hauteur de l'objet a(i).Name = checkBoxName 'MsgBox(checkBoxName & vbNewLine & a(i).Name) .Visible = True .Enabled = True 'MsgBox(a(i).Created) End With Next End Sub
Si vous avez des questions n'hésitez pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Public dictionnaire() As Dictionary(Of Boolean, Dictionary(Of Object, String)) 'afin de faire (ce n'est qu'a titre d'informations pour vous aider à saisir l'idée) dictionnaire("yf", Dictionary("Valeur de yf", "Commentaire sur la désignation")
Cordialement,
Nicolas
Partager