Position dans chaine

Résolu
Troyan Messages postés 170 Date d'inscription mardi 2 juillet 2002 Statut Membre Dernière intervention 21 janvier 2012 - 14 janv. 2010 à 14:22
Troyan Messages postés 170 Date d'inscription mardi 2 juillet 2002 Statut Membre Dernière intervention 21 janvier 2012 - 14 janv. 2010 à 22:47
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

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
14 janv. 2010 à 15:43
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)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
14 janv. 2010 à 14:42
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)
0
pile_poil Messages postés 682 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 4 août 2012 6
14 janv. 2010 à 14:46
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
0
Troyan Messages postés 170 Date d'inscription mardi 2 juillet 2002 Statut Membre Dernière intervention 21 janvier 2012
14 janv. 2010 à 15:30
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
0

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

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
14 janv. 2010 à 15:40
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)
0
Troyan Messages postés 170 Date d'inscription mardi 2 juillet 2002 Statut Membre Dernière intervention 21 janvier 2012
14 janv. 2010 à 16:29
Au top Jack c'est exactement ça !!!



******************************************
Installation Home-Cinéma de particuliers sur http://www.digital16-9.com
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 janv. 2010 à 17:25
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]
0
Troyan Messages postés 170 Date d'inscription mardi 2 juillet 2002 Statut Membre Dernière intervention 21 janvier 2012
14 janv. 2010 à 22:32
elle a pas marché ta fonction :(


************************************************************************
Installation Home-Cinéma de particuliers sur http://www.digital16-9.com
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 janv. 2010 à 22:45
c'est une question?

tu as peut-être oublié de cliquer sur le bouton1
0
Troyan Messages postés 170 Date d'inscription mardi 2 juillet 2002 Statut Membre Dernière intervention 21 janvier 2012
14 janv. 2010 à 22:47
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
0
Rejoignez-nous