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.

Déroulement du code :

Je vais détailler les étapes du programme pour vous donner une idée global de son fonctionnement :

  1. Tout d'abord, il faut ouvrit un explorer via un bouton, afin de sélectionner un fichier en .rtf (format du rapport)
  2. Le programme se charge de convertir le fichier .rtf en fichier texte .txt
  3. Une fois le fichier texte créé, le programme l'ouvre dans un streamreader qui récupère la globalité du fichier (soit 800 lignes ~)
  4. 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.
  5. 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.
  6. 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.
  7. 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.
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.


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

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
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
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")
Si vous avez des questions n'hésitez pas.

Cordialement,
Nicolas