Position dans chaine

Résolu
Signaler
Messages postés
171
Date d'inscription
mardi 2 juillet 2002
Statut
Membre
Dernière intervention
21 janvier 2012
-
Messages postés
171
Date d'inscription
mardi 2 juillet 2002
Statut
Membre
Dernière intervention
21 janvier 2012
-
Bonjour à tous,

voila je voudrais créer une fonction qui me retourne la position d'un caractere que je recherche dans une chaine, mais pas forcement le premier.

je m'explique, j'ai une chaine de caractere comme ça
"tutu toto tata titi zizi"
je voudrais connaitre la position du 2e espace c'est à dire 10.

l'idée c'est comme la fonction split qui me permet de compter le nombre de mot spliter mais au lieu du nombre de mot la position du split.

quand je fais split("tutu toto tata titi zizi", " ")
il me créer
TUTU
TOTO
TATA
TITI
ZIZI

est je peux savoir qu'il y a 6 mots.
et bien l'idée c'est la meme chose mais en rendu position
5
10
15
ect...

ou mieux directement la bonne position que je recherche en ameliorant le split.

MaPos("tutu toto tata titi zizi", " ",2)
donc j'ai ma chaine, mon delimiter, et un nombre de delimiter à trouver
donc cette fonction me renvoit 10.


Je suis plus que preneur car je ne sais pas comment faire
Ch.









******************************************
Installation Home-Cinéma de particuliers sur http://www.digital16-9.com

10 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Ah oui, une autre solution astucieuse :
' Découpage complet
aMots = Split(maChaine, " ")
' Ne garde que les premières occurrences recherchées
ReDim Preserve aMots(PositionCherchée - 1)
' Refait une chaine
sTemp = Join(aMots, " ")
' Résultat
lPos = Len(sTemp)  ' peut être avec un + 1

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut
L'instruction Instr fait ça très bien.
Il te suffit de faire un boucle pour compter les occurrences :
Exemple en VB6 :
Compteur = 0
r = Instr(1, maChaine, " ")
Do While r > 0
  Compteur = Compteur + 1
  If Compteur = 2 Then
    ValeurRetournée = r
    Exit Do
  End If
  r = Instr(r + 1, maChaine, " ")
Loop

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
Dim sChaine As String
Dim iNombre As Integer
Dim iPosition As Integer
Dim x As Integer
sChaine = "tutu toto tata titi zizi"
iNombre = 0
iPosition = 0
For x = 1 To Len(sChaine)
    If Mid(sChaine, x, 1) " " Then iNombre iNombre + 1 ' te donne le nombre d'espaces
Next x
iPosition = InStr(sChaine, " ") ' te donne la position du premier espace
MsgBox "Nombre " & iNombre & " ,  position du premier " & iPosition




si c'est la solution, penser : REPONSE ACCEPTEE
Messages postés
171
Date d'inscription
mardi 2 juillet 2002
Statut
Membre
Dernière intervention
21 janvier 2012

alors cette solution est deja faite, seulement j'ai oublié de le preciser le tout serait d'eviter la boucle car hyper couteuse en temps.

car pour tout vous dire c'est une compilation d'un fonction pour SQL server est cette meme fonctione va etre appellée environ 60 millions de fois.
inutiles de vous dire que chaque millisecondes s'avere etre des heures à chaque fois.

donc l'idée du split c'ete de savoir si il possede des fonctions ou autre car du coup lui vu qu'il fait un tableau connait forcement la position à splitter.







******************************************
Installation Home-Cinéma de particuliers sur http://www.digital16-9.com
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Oui mais une fois ta chaine Splittée, il faudra de toute façon faire une boucle pour récupérer la longueur de chaque mot :
aMots = Split(maChaine, " ")
lPos = 0
If PositionCherchée > (UBound(aMots) + 1) Then
  MsgBox "Nombre de mots insuffisants"
Else
  For r = 0 To (PositionCherchée - 1)
    lPos = lPos + Len(aMots(r)) + 1
  Next r
  MsgBox "Position du " & PositionCherchée & "ème espace : " & lPos
End If

A affiner.

Alors, entre faire une boucle après un Split ou une boucle avec Instr avant, il ne doit pas y avoir beaucoup de différence. J'opterais plutôt pour la boucle avec Instr.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
171
Date d'inscription
mardi 2 juillet 2002
Statut
Membre
Dernière intervention
21 janvier 2012

Au top Jack c'est exactement ça !!!



******************************************
Installation Home-Cinéma de particuliers sur http://www.digital16-9.com
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
salut,

mais c'est pas du dotnet?

pis une très grande chaine, un tableau en mémoire, un peu long non?


une idée....

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MessageBox.Show(IndexOfN("tutu toto tata titi zizi", " "c, 2).ToString)
    End Sub

    Function IndexOfN(ByRef Expression As String, ByVal Find As Char, ByVal Occurrence As Integer) As Integer
        If Occurrence <= 0 Then
            Return -1
        ElseIf Occurrence = 1 Then
            Return Expression.IndexOf(Find)
        Else
            Dim iPos As Integer = -1
            Dim i As Integer = 1

            Do
                iPos = Expression.IndexOf(Find, iPos + 1)
                If iPos = -1 Then
                    Return -1 'on quitte
                Else
                    If i = Occurrence Then
                        Return iPos 'position trouvée, on retourne
                    Else
                        i += 1 'next
                    End If
                End If
            Loop
        End If
    End Function


ici on boucle uniquement sur le count des espaces, donc pas sur tous les caractères, et on quitte avant d'arriver à la fin de la chaine si l'espace n'est pas trouvé

NB : ne pas oublier en dotnet que le premier caractère est en position 0 et non 1 (vb6)

++

[hr]
Messages postés
171
Date d'inscription
mardi 2 juillet 2002
Statut
Membre
Dernière intervention
21 janvier 2012

elle a pas marché ta fonction :(


************************************************************************
Installation Home-Cinéma de particuliers sur http://www.digital16-9.com
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
c'est une question?

tu as peut-être oublié de cliquer sur le bouton1
Messages postés
171
Date d'inscription
mardi 2 juillet 2002
Statut
Membre
Dernière intervention
21 janvier 2012

non comme je te l'ai dis c'est pour placer dans une fonction SQL Server
donc je n'ai pris que la fonction...

et j'ai une erreur ici
Expression.IndexOf(Find, iPos + 1)

indexOf n'est pas membre j'ai plus le message en tete...

******************************************
Installation Home-Cinéma de particuliers sur http://www.digital16-9.com