Supprimer un mot une fois même si present plusieurs fois dans un string [Résolu]

Signaler
Messages postés
58
Date d'inscription
mardi 21 septembre 2010
Statut
Membre
Dernière intervention
14 juillet 2013
-
Messages postés
6
Date d'inscription
jeudi 23 février 2012
Statut
Membre
Dernière intervention
16 juillet 2013
-
Bonjour tout le monde!

Voilà, je bosse sur un petit programme qui doit stocker des infos dans des fichiers ini, mais voilà, j'ai une valeur dans mon ini formaté de manière à ce que je puisse le convertir en table via un split, il est formaté comme ça: Item1|Item2|Item3
Ce que je voudrais, c'est supprimer une "item" de ce string, j'ai fait avec un replace, mais si j'ai deux fois la même "item" dans ce string, les deux sont supprimé, alors que je voudrais n'en supprimer qu'une, un petit exemple sera plus simple pour comprendre:

Par exemple, mon string est: Pain|Pomme|Pomme
Je voudrais qu'après la suppression d'une "Pomme", mon string soit: Pain|Pomme

J'ai tenté une combinaison avec Replace (si le string = item à enlever), string.Remove (quand l'item est au milieu du string) et un Microsoft.VisualBasic.Right (quand l'item est tout au bout du string), mais ça me fait soit des erreurs ArgumentOutOfRangeException, soit ça tranche le string n'importe comment, soit ça marche une fois sur 3600 sans raisons. Voilà le bout de code (writeParam(file, param, value) écris un paramètre dans un ini, getParam(file, param) va chercher un paramètre dans un ini):

            Dim invString As String = getParam("characters" & character, "Weapons")

            If Not invString = String.Empty Then

                Dim wepToRem As String = WepsList.SelectedItem.ToString

                MsgBox(Len(invString) & "-" & Len(wepToRem) & "-" & Len(wepToRem))

                MsgBox(Microsoft.VisualBasic.Right(invString, (Len(invString) - Len(wepToRem)) - Len(wepToRem)))

                If invString = wepToRem Then
                    writeParam("characters" & character, "Weapons", "")
                ElseIf Microsoft.VisualBasic.Right(invString, (Len(invString) - Len(wepToRem)) - Len(wepToRem)) = wepToRem Then
                    writeParam("characters" & character, "Weapons", Microsoft.VisualBasic.Right(invString, (Len(invString) - Len(wepToRem))))
                Else
                    Dim remStartPos As Integer = invString.IndexOf(wepToRem)
                    Dim remEndPos As Integer = remStartPos + (wepToRem.Length) + 1

                    MsgBox(remStartPos & ";" & remEndPos)

                    Dim newInv As String = invString.Remove(remStartPos, remEndPos)

                    writeParam("characters" & character, "Weapons", newInv)
                    End If

            End If


Je bloque sur ce petit détail et je ne peut plus avancer. Quelqu'un pourrait il m'aider s'il vous plait? Merci!

9 réponses


Ma batterie est vide, donc essaie cela:

 Sub raccourcir()
        Dim cestlong As String = "Pain|Pomme|Pomme"
        Dim cesttrop As String = "Pomme"
        Dim laplace As Integer = cestlong.LastIndexOf("Pomme")
        Dim pluscourt As String = cestlong.Substring(0, laplace)
        Dim EncorePlusCourt As String = cestlong.Substring(0, laplace - 1)
        MessageBox.Show(pluscourt)
        MessageBox.Show(EncorePlusCourt)
    End Sub
Messages postés
58
Date d'inscription
mardi 21 septembre 2010
Statut
Membre
Dernière intervention
14 juillet 2013
3
Merci pour votre aide. A force de revoir mon code, j'ai compris que j'avais mal interprété le second paramètre de string.Remove, que je pensé être la position de la fin du segment à supprimer à partir du début du string, en corrigeant ça, j'ai bricolé un Sub qui marche très bien:

Public Sub remFromTable(ByVal file As String, ByVal param As String, ByVal toRem As String)
        Dim oldStr As String = getParam(file, param)

        If Not oldStr = String.Empty Then

            Dim strRemStart As Integer = oldStr.LastIndexOf(toRem)
            Dim strRemLength As Integer = toRem.Length

            Dim newStr As String = oldStr.Remove(strRemStart, strRemLength)

            ' Remove double | 
            newStr = newStr.Replace("||", "|")

            ' Remove | at the end of th string
            If Microsoft.VisualBasic.Right(newStr, 1) = "|" Then
                newStr = Microsoft.VisualBasic.Left(newStr, newStr.Length - 1)
            End If

            ' Remove | at the start of the string
            If Microsoft.VisualBasic.Left(newStr, 1) = "|" Then
                newStr = Microsoft.VisualBasic.Right(newStr, newStr.Length - 1)
            End If

            writeParam(file, param, newStr)


        End If

    End Sub


Merci beaucoup pour votre aide a tous.

Bonjour,

Puis tiens une autre pour le fun, tant qu'à l'avoir faite.

 Sub ValeursUniques()
     Dim ToutesLesValeurs As String = "Séraphin Donalda Séraphin Alexis Ovide Rosa-Rose Alexis Bidou Séraphin Donalda Séraphin Alexis Ovide Rosa-Rose Alexis Bidou"
     Dim ValeursUniques As New List(Of String)
     Dim TableauValeurs() As String = Split(ToutesLesValeurs)
     Dim i As Integer = 0
     For Each mot As String In TableauValeurs
         If Not ValeursUniques.Contains(mot) Then
             ValeursUniques.Insert(i, mot)
             i += 1
         End If
     Next
     Dim ligne As String = String.Empty
     For Each unmot In ValeursUniques
         ligne = String.Concat(ligne, ", ", unmot)
     Next
     MessageBox.Show(ligne)
 End Sub

Bonjour,

Encore une question avec des réponses et des exemples dans l'AIDE

Avant de spitter

On trouve l'intrus avec les méthodes String.IndexOF, String.LasIndexOF, String.IndexOfAny, String.LastIndexOfAny et leurs surcharges.

On efface l'intrus avec la méthode String.Remove et sa surcharge.

Masis, c'est bien moins forçant de faire faire l'ouvrage par les autres. Mais, moi, cela ne me tente vraiment pas.

Et puis tu as assez pistes pour faire un petit effort de recherche, comme le demande le règlement.

Parce que si tu avais vraiment pris le temps d'essayer tout ce que prétends avoir essayé; tu aurais vite trouvé qu'il suffit de faire attention au fait que tous les indices retournés par les méthodes du Framework considèrent que le premier caractère d'une chaîne porte le numéro zéro et que toutes les méthodes que tu prétends avoir essayées permettent de contrôler le point de départ et la longueur du texte à examiner ou effacer. Le seul effort à faire est de calculer convenablement le point de départ ou d'arrivée, la longueur du texte et de s'ajuster avec des +1 ou des -1 bien placés.

C'est donc dire que je suis persuadé que, dans ta question, tu nous montes un bateau.

Et puis, si tu prends le temps de mettre des espions à la bonne place et de passer tes opérations sur les chaînes au pas à pas, tu peux déduire extrêmement facilement à quel endroit mettre des +1 ou des -1.
Messages postés
58
Date d'inscription
mardi 21 septembre 2010
Statut
Membre
Dernière intervention
14 juillet 2013
3
Cela fait deux jours que je bloque bêtement la dessus, et si vous croyez que je vous raconte quelques bêtises pour qu'on fasse le boulot à ma place, sachez que vous vous trompez. J'ai bien tentez le string.Remove et les IndexOf, mais je ne comprend justement pas ou j'ai fait des erreurs, je revois mon code au moment au je vous tape se message et je peine assez car je n'ai jamais réellement eu besoin de manier les string de cette façon auparavant. Je doute même que vous ayez lus mon bout de code avant de répondre. Je vous pris de bien vouloir lire attentivement avant de jeter tout ça à la figure comme si j'étais un fainéant. Et ne venez pas me mettre le règlement sous le nez comme si j'étais un irresponsable, si je ne l'avais pas lus, je n'aurais pas posté un message détaillé et mon code. De plus, bien que ça n’excuse pas mes erreurs et que vous ne pouvez pas le savoir, je souffre actuellement de problème de concentration. Alors s'il vous plait, veuillez éviter ce genre de remarques sans réfléchir. Je ne vous en veux pas car vous avez tout de même tentez de répondre à un partie de ma question.

Par rapport au code, j'ai bien tenté comme je l'ai dis la méthode string.Remove avec IndexOf et d'ajuster avec des +1/-1. Mais il doit y avoir une erreur ou deux que je n'arrive pas a voir.
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Salut

Private Function RemoveDuplicateString() As List(Of String)
        Dim str1 As String = "pomme|poires|pomme|pain|petit pain|poires"
        Dim listresult As New List(Of String)
        Dim splitedstring() As String
        splitedstring = str1.Split("|"c)
        For Each item In splitedstring
            If Not listresult.Contains(item) Then
                listresult.Add(item)
            End If
        Next
        Return listresult
    End Function
Messages postés
6
Date d'inscription
jeudi 23 février 2012
Statut
Membre
Dernière intervention
16 juillet 2013

Yup ça sembl marcher aussi! Merci!


- Créateur de bugs invraisemblables professionnel depuis toujours. -