Traitement chaine VB.Net [Résolu]

Messages postés
31
Date d'inscription
jeudi 2 octobre 2003
Dernière intervention
12 avril 2013
- - Dernière réponse :  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
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Messages postés
14385
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
17 février 2019
153
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de NHenry
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
14385
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
17 février 2019
153
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de NHenry
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 décembre 2018
51
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_ShayW
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
31
Date d'inscription
jeudi 2 octobre 2003
Dernière intervention
12 avril 2013
0
Merci
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
Commenter la réponse de cs_ttornade
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 décembre 2018
51
0
Merci
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
Commenter la réponse de cs_ShayW
Messages postés
31
Date d'inscription
jeudi 2 octobre 2003
Dernière intervention
12 avril 2013
0
Merci
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
Commenter la réponse de cs_ttornade
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
26 décembre 2018
51
0
Merci
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
Commenter la réponse de cs_ShayW
0
Merci
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
Commenter la réponse de Utilisateur anonyme
Messages postés
31
Date d'inscription
jeudi 2 octobre 2003
Dernière intervention
12 avril 2013
0
Merci

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
Commenter la réponse de cs_ttornade

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.