Aide pour remplir un tableau

Résolu
huelce Messages postés 45 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 28 juillet 2004 - 26 juil. 2004 à 12:33
  - 26 juil. 2004 à 14:43
Bonjour,
j'aimerai remplir un tableau à partir d'une ligne. Jusque là tout va bien.
Mais je veux dicerner 2 types d'éléments dans la ligne :

1) des éléments simples entourés d'espaces, les mots en somme

2) des chaines balisées de { et }

Par exemple la ligne :

COM aa bb {cc dd} ee

formerai un tableau avec les élélents :
- aa
- bb
- cc dd
- ee

J'allais oublier que le premier élément de la ligne ne doit pas être prix en compte dans le tableau, car il s'agit d'une commande, je veux récupèrer les arguments de cette commande.

De plus les délimiteurs { et } ne sont pas forcément définitifs dans mon projet, l'essentiel est de pouvoir dicerner des mots séparés par des espaces et des chaines contenant des espaces ; et remplir un tableau de ces éléments.

J'ai mis au point une solution mais abominable, lente et pas toujours efficace... hors ce tableau sera un élément crucial du projet.

Merci de me donner des pistes ou des exemples à exploiter

8 réponses

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
26 juil. 2004 à 12:43
Voici un canevas d'algo :
1- Prendre la chaine caractère par caractère
2- Pour chaque caractère, s'il s'agit d'autre chose que d'un espace ou un { ou un }, le ranger a la fin d'une variable Buffer.
3- S'il s'agit d'un espace, la variable buffer contient un item, a ranger dans un tableau et remettre Buffer à vide
4- S'il s'agit d'un {, trouver le } le plus proche. Tu as alors les limite d'un item du style du {cc dd} de ton exemple.
5- Ne pas oublié qu'à la fin de la boucle, Buffer risque de contenir le dernier item de la ligne : Le "ee" dans ton exemple.

C'est OK ou tu veux un code complet ?

Christophe R.
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
26 juil. 2004 à 13:27
je suis d'accord que l'algo n'est ni long ni complexe...

les expressions regulières existent bel et bien en VB6.

Private Sub Form_Load()
    Dim Tableau() As String
    Dim i As Integer
    For i = 0 To SplitArgs2("COM aa bb {cc dd} ee", Tableau)
        List1.AddItem Tableau(i)
    Next i
End Sub


voici l'algo utilisant des RegEx :

Public Function SplitArgs(Str As String, Output() As String) As Integer
    '# reference RegExp -> Microsoft VbScript Regular Expressions
    Dim Reg As New RegExp
    Dim Matches As MatchCollection
    Reg.Pattern = "{.+}|[^{}\s]+"
    Reg.Global = True
    Set Matches = Reg.Execute(Str)
    
    ReDim Output(Matches.Count - 1)
    Dim i As Integer
    For i = 0 To Matches.Count - 1
        Output(i) = Matches(i).Value
    Next i
    SplitArgs = Matches.Count - 1
End Function


et sans RegEx :

Public Function SplitArgs2(Str As String, Output() As String) As Integer
    Dim Buffer As String
    Dim Index As Integer
    Dim i As Integer
    Dim Join As Boolean
    
    Dim Car As String * 1
    
    SplitArgs2 = -1
    
    For i = 1 To Len(Str)
        Car = Mid(Str, i, 1)
        Select Case Car
            Case " "
                If Not Join Then
                    GoSub AddtoTab
                Else
                    Buffer = Buffer & " "
                End If
            Case "{"
                Join = True
            Case "}"
                Join = False
            Case Else
                Buffer = Buffer & Car
        End Select
    Next i
    GoSub AddtoTab
Exit Function
AddtoTab:
    SplitArgs2 = SplitArgs2 + 1
    ReDim Preserve Output(SplitArgs2) As String
    Output(SplitArgs2) = Buffer
    Buffer = vbNullString
Return
End Function
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
26 juil. 2004 à 13:01
une chose me vient à l'esprit : "Expressions régulières"
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
26 juil. 2004 à 13:06
Mais en VB6 !! Tu te les fait toi-même tes expressions régulières !De toute façon il y a une quinzaine de ligne au plus, c'est pas la mère à boire

Christophe R.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
26 juil. 2004 à 13:57
Ouais mais tu ajoutes une référence à ton exe aussi !! Déjà que le VB6 et chiant à déployer !!!!

Christophe R.
0
huelce Messages postés 45 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 28 juillet 2004 1
26 juil. 2004 à 14:06
Merci pour vos réponses rapides,

crenaud76 :
Oui j'ai bien compris ton idée, c'est beaucoup plus simple que ce que je faisais et ca marchera parfaitement. Un grand merci !

Renfield, merci à toi aussi pour tes pistes, et tes exemples en prime.
A vrai dire je n'ai jamais utilisé les regexp en VB mais c'est vrai qu'il sont une solution idéale. Je vais m'y pencher sérieusement.

MERCI à vous deux !
J'ai largement de quoi résoudre mon problème et même plus :)
0
huelce Messages postés 45 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 28 juillet 2004 1
26 juil. 2004 à 14:20
Dites-moi, si je n'abuses pas, quelle est cette référence justement ?
0
Jen'ai rien dit... j'avais pas pu vu qu'elle était dans un commentaire.
0
Rejoignez-nous