Traitement chaine VB.Net

Résolu
cs_ttornade Messages postés 31 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 12 avril 2013 - 10 avril 2013 à 22:58
 Utilisateur anonyme - 12 avril 2013 à 15:51
Bonsoir,

je cherche un moyen plus propre pour résoudre le problème suivant:
J'ai une chaine construite de la façon suivante comme input
Dim chaine as String ="Str1;Val1-Str1;Val2-Str1;Val3|Str2;Val2-Str2;Val1|Str3;Val2"
L'objectif est de le parcourir et reproduire une chaine comme suite:
Str1:Val1;Val2;Val3|Str2:Val2;Val1|Str3:Val2

Merci,

TTornado

11 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
10 avril 2013 à 23:13
Bonjour,

Déjà avec un String.Split, il y a de quoi faire, ensuite, ce n'est que de la manipulation de tableaux et de collections.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
3
Utilisateur anonyme
11 avril 2013 à 00:08
Bonsoir,
Si tu veux une méthode différente:
(et plus lisible, car j'ai utilisé les balises de code, moi...)

        Dim St As String
        Dim Str As String = "Str1;Val1-Str1;Val2-Str1;Val3|Str2;Val2-Str2;Val1|Str3;Val2"
        Dim SsTableau() As String
        Dim Tableau() As String = Split(Str, "|")
        Str = ""
        For i As Integer = 0 To UBound(Tableau)
            'ListBox1.Items.Add(Tableau(i))
            St = Tableau(i)
            SsTableau = Split(St, ";")
            St = SsTableau(0) & ":" & Replace(St, SsTableau(0), "")
            St = Replace(St, "-", "")
            St = Replace(St, ":;", ":")
            If i > 0 And i < (UBound(Tableau) + 1) Then Str &= "|"
            Str &= St
        Next
        MsgBox(Str)



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
11 avril 2013 à 09:29
Bonjour,

A la place de "ArrayList" utilises plutôt "List(Of T)" (où T est remplacé par le type désiré), ce sera encore plus sûr au niveau du type des valeurs dans la collection.

Mon site
3
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
11 avril 2013 à 13:46
plutot
 Dim St As String
        Dim Str As String = "Str1;Val1-Str1;Val2-Str1;Val3|Str2;Val2-Str2;Val1|Str3;Val2"
        Dim SsTableau() As String
        Dim Tableau() As String = Str.Split("|"c)
        Str = ""
        For i As Integer = 0 To Tableau.Count - 1
            'ListBox1.Items.Add(Tableau(i))
            St = Tableau(i)
            SsTableau = St.Split(";"c)
            St = SsTableau(0) & ":" & St.Replace(SsTableau(0), "")
            St = St.Replace("-", "")
            St = St.Replace(":;", ":")
            If i > 0 And i < (Tableau.Count) Then Str &= "|"
            Str &= St
        Next
3

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

Posez votre question
Utilisateur anonyme
12 avril 2013 à 15:51
Re:
Hé bien... j'ai fait un copier/coller des vos chaines:
"Str1;Val1-Str1;Val3-Str2;Val2-Str2;Val1-Str3;Val2-Str1;Val2-Str2-Val4-Str1;Val5-Str1;Val1-Str1;Val3-Str2;Val2-Str1;Val15-Str2;Val1-Str3;Val2-Str1;Val2-Str2;ValX-Str3;ValY"

1) Première hypothèse: Il n'y a pas de faute de frappe dans la chaine, et je vois tout de suite cet morceau:
Str2-Val4

Ce qui nous force a abandonner l'idée d'utiliser les ";" comme séparateur de base, dans ce cas tous les séparateurs présents dans la chaîne ne nous sont d'aucune utilité, il nous reste uniquement un dénominateur commun connu qui est le nom de la clé (Str) et le nom de la valeur (Val), donc:
        'Nous avons la chaine:
        Dim Stringona As String = _
            "Str1;Val1-Str1;Val3-Str2;Val2-Str2;Val1-Str3;Val2-Str1;Val2-Str2-Val4-Str1;Val5" & _
            "-Str1;Val1-Str1;Val3-Str2;Val2-Str1;Val15-Str2;Val1-Str3;Val2-Str1;Val2-Str2;ValX-Str3;ValY"
        'On illimine tous les séparateurs et on les remplace par des espaces
        Stringona = Replace(Stringona, ";", " ")
        Stringona = Replace(Stringona, ":", " ")
        Stringona = Replace(Stringona, "-", " ")
        Stringona = Replace(Stringona, "|", " ")

        Dim Tableau() As String = Split(Stringona)
        'Nous obtenons donc une liste de clés suivies de la valeur correspondante
        Dim ListeStr As New ListBox
        Dim t As Integer
        Dim Str As String
        Dim Existe As Boolean

        For i As Integer = 0 To UBound(Tableau)
            If UCase(Tableau(i).ToCharArray(0, 1)) = "S" Then 'Si ça commence par un 'S' (une clé donc)
                Existe = False
                For t = 0 To ListeStr.Items.Count - 1
                    If Tableau(i) ListeStr.Items.Item(t).ToString.ToCharArray(0, Tableau(i).Length) Then Existe True : Exit For
                Next
                For t = 0 To ListeStr.Items.Count - 1
                Next
                If Existe = False Then ListeStr.Items.Add(Tableau(i) & ":")
            Else
                For t = 0 To ListeStr.Items.Count - 1
                    If Tableau(i - 1) = ListeStr.Items.Item(t).ToString.ToCharArray(0, Tableau(i).Length) Then
                        Str = ListeStr.Items.Item(t).ToString & ";" & Tableau(i)
                        ListeStr.Items(t) = Str
                        Exit For
                    End If
                Next
            End If
        Next
        Str = ""
        For i = 0 To ListeStr.Items.Count - 1
            If i < ListeStr.Items.Count - 1 Then
                Str &= ListeStr.Items.Item(i).ToString.Replace(":;", ":") & "|"
            Else
                Str &= ListeStr.Items.Item(i).ToString.Replace(":;", ":")
            End If
        Next
        MsgBox(Str)


2) Deuxième hypothèse:
Il existe une faute de frappe dans la chaîne présentée (que j'ai rectifié).
Nous pouvons donc en déduire que nous pouvons utiliser les séparateurs pour constituer des tableaux, donc:
        Dim Stringona As String = _
           "Str1;Val1-Str1;Val3-Str2;Val2-Str2;Val1-Str3;Val2-Str1;Val2-Str2;Val4-Str1;Val5" & _
           "-Str1;Val1-Str1;Val3-Str2;Val2-Str1;Val15-Str2;Val1-Str3;Val2-Str1;Val2-Str2;ValX-Str3;ValY"
        Dim Tableau() As String = Split(Stringona, "-")
        Dim TableauCleValeur() As String
        Dim ListeStr As New ListBox
        Dim Existe As Boolean
        Dim Str As String = ""
        Dim t As Integer

        For i As Integer = 0 To UBound(Tableau)
            Existe = False
            TableauCleValeur = Split(Tableau(i), ";")
            For t = 0 To ListeStr.Items.Count - 1
                If TableauCleValeur(0) = ListeStr.Items.Item(t).ToString.ToCharArray(0, TableauCleValeur(0).Length) Then
                    ListeStr.Items(t) &= ";" & TableauCleValeur(1)
                    Existe = True
                    Exit For
                End If
            Next
            If Existe = False Then ListeStr.Items.Add(TableauCleValeur(0) & ":" & TableauCleValeur(1))
        Next

        For i = 0 To ListeStr.Items.Count - 1
            If i < ListeStr.Items.Count - 1 Then
                Str &= ListeStr.Items.Item(i).ToString & "|"
            Else
                Str &= ListeStr.Items.Item(i).ToString
            End If
        Next
        MsgBox(Str)


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
3
cs_ttornade Messages postés 31 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 12 avril 2013
10 avril 2013 à 23:30
J'ai oublié de poster mon algo actuel
Dim Stringona = "Str1;Val1-Str1;Val2-Str1;Val3|Str2;Val2-Str2;Val1|Str3;Val2"
Dim checkAL As New ArrayList
Dim ss As String() = Stringona.Split(CChar("-"))
For Each elmt As String In ss
If Not checkAL.Contains(elmt.Split(CChar(";"))(0)) Then
checkAL.Add(elmt.Split(CChar(";"))(0))
End If
Next

Dim i As Integer
Dim Stringona2 As String = String.Empty

For Each elmt2 As String In checkAL
i = 0
For Each elmt As String In ss
If elmt.Split(CChar(";"))(0) = elmt2 Then
If i = 0 Then
Stringona2 += elmt2 + ":" + elmt.Split(CChar(";"))(1)
i = 1
Else
Stringona2 += ";" + elmt.Split(";")(1)
End If
End If
Next
Stringona2 += "|"
Next
Il fonctionne bien mais je voudrais une soluce plus simple histoire confronter mon raisonnement

TTornado
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
11 avril 2013 à 13:42
Salut

avec le code de Acive en net

Dim St As String
        Dim Str As String = "Str1;Val1-Str1;Val2-Str1;Val3|Str2;Val2-Str2;Val1|Str3;Val2"
        Dim SsTableau() As String
        Dim Tableau() As String = Str.Split("|"c)
        Str = ""
        For i As Integer = 0 To Tableau.Count - 1
            'ListBox1.Items.Add(Tableau(i))
            St = Tableau(i)
            SsTableau = St.Split(";"c)
            St = SsTableau(0) & ":" & St.Replace(SsTableau(0), "")
            St = St.Replace("-", "")
            St = St.Replace(":;", ":")
            If i > 0 And i < (Tableau.Count + 1) Then Str &= "|"
            Str &= St
        Next
0
cs_ttornade Messages postés 31 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 12 avril 2013
11 avril 2013 à 17:05
ShayW: ....plutot
Dim St As String
        Dim Str As String = "Str1;Val1-Str1;Val2-Str1;Val3|Str2;Val2-Str2;Val1|Str3;Val2"
        Dim SsTableau() As String
        Dim Tableau() As String = Str.Split("|"c)
        Str = ""
        For i As Integer = 0 To Tableau.Count - 1
            'ListBox1.Items.Add(Tableau(i))
            St = Tableau(i)
            SsTableau = St.Split(";"c)
            St = SsTableau(0) & ":" & St.Replace(SsTableau(0), "")
            St = St.Replace("-", "")
            St = St.Replace(":;", ":")
            If i > 0 And i < (Tableau.Count) Then Str &= "|"
            Str &= St
        Next




Ta méthode fonctionne selon la chaine que j'ai postée et là c'est de ma faute car je n'ai pas été précis au départ.
En réalité la chaine pourrait parvenir de façon désoordonnée du type
Dim Stringona as String = "Str1;Val1-Str1;Val3-Str2;Val2-Str2;Val1-Str3;Val2-Str1;Val2-Str2-Val4-Str1;Val5"


je crois que ma solution corrigée des suggestions de

NHenry:
Bonjour,

A la place de "ArrayList" utilises plutôt "List(Of T)" (où T est remplacé par le type désiré), ce sera encore plus sûr au niveau du type des valeurs dans la collection.
va bien

Merci à tous

TTornado
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
11 avril 2013 à 17:46
Ta méthode fonctionne


l'algo n'est pas de moi mais d'Acive

important dans la question tous les détails
c'est de ma faute car je n'ai pas été précis au départ.
En réalité la chaine pourrait parvenir de façon désoordonnée du type


ça change un peu
0
Utilisateur anonyme
11 avril 2013 à 23:27
Re:
Comme il dit Shayw ça change tout (mais je m'en doutais un peu) j'ai voulu être bête et discipliné

c'est une façon de trier entre autres, maintenant que tu dis que ça peux arriver dans un ordre complètement différent, j'ai une question:
Tu as supprimé les "|" en tant que séparateur? ils n'existent plus?

Ce soir (chez moi, UTC-4) si j'ai un moment je vais le simplifier, par contre je dois savoir impérativement quels sont tous les séparateurs (:;-| etc).


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
cs_ttornade Messages postés 31 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 12 avril 2013
12 avril 2013 à 09:46

Comme il dit Shayw ça change tout (mais je m'en doutais un peu) j'ai voulu être bête et discipliné

c'est une façon de trier entre autres, maintenant que tu dis que ça peux arriver dans un ordre complètement différent, j'ai une question:
Tu as supprimé les "|" en tant que séparateur? ils n'existent plus?

Ce soir (chez moi, UTC-4) si j'ai un moment je vais le simplifier, par contre je dois savoir impérativement quels sont tous les séparateurs (:;-| etc).

J'ai déjà la solution postée mais un algo en plus ne ferait jamais mal; histoire de vouloir améliorer.
La chaine de départ contient un séparateur "-" regroupant couple type "CleN;Vali" (N=1,..,n) et (i=1,...,n)
Dim strDepart As String = "Str1;Val1-Str1;Val3-Str2;Val2-Str1;Val15-Str2;Val1-Str3;Val2-Str1;Val2-Str2;ValX-Str3;ValY"
Dim strFinal As String

L'objectif est de regrouper pour chaque Stri(i=1,..,n) et d'obtenir une chaine finale du type
"Cle1:Val1;Val3;ValX|Cle3:Val3;Val4;Val1|Cle2:Val2;Val1;ValX" et ainsi de suite. Comme suit
strFinal = "Str1:Val1;Val3;Val15;Val2|Str2:Val2;Val1;ValX|Str3:Val2;ValY"


Merci,

TTornado
0
Rejoignez-nous