Benutzer mit den meisten Antworten
Die Funktion "split"

Frage
-
Hallo zusammen,
ich habe gesehen, dass es in VB eine Funktion "split" gibt, die anhand eines EINZELNEN Trennzeichens einen String zerlegt und die Einzelteile in einem Array speichert.
Nun suche ich etwas, dass es in PHP gibt, und zwar die Möglichkeit, als Separator einen ganzen Textblock zu verwenden, mit Hilfe dessen gesplittet wird (also nicht nur EIN Zeichen). Weiß jemand, ob es sowas auch in VB gibt?
Gruß
Thomas
Antworten
-
- Als Antwort markiert Robert BreitenhoferModerator Montag, 3. Dezember 2012 12:01
Alle Antworten
-
- Als Antwort markiert Robert BreitenhoferModerator Montag, 3. Dezember 2012 12:01
-
Hallo zusammen.
Ich habe das auch mal gemacht, und dabei einen folgenschweren "Denkfehler" begangen. Man muss darauf aufpassen, dass etwa bei "BAUM<x>HAUS" das Resultat eines Splittens bei <x> nicht etwa "BAUM" und "HAUS" ist, sondern "BAUM" und "x>HAUS".
Split splittet also zwar korrekt an der Position jedes Auftretens des Trenn-Strings, ersetzt/löscht jedoch immer nur 1 Zeichen. Bei längeren Trenn-Strings muss man also das Resultat noch ein wenig bearbeiten, um wirklich die getrennten Einzelworte zu erhalten!
Besser wäre etwas wie:
Quellstring.Replace(Trennstring, Chr(255).Split(Chr(255).ToList
Dieses Resultat liefert dann wirklich "BAUM" und "HAUS" in einer Liste. Diese könnte man dann auch durch alternierendes Addieren von Element und Trennstring wieder "zurückwandeln", á la:
ZielString=Teilstring(0)
For I as Integer = 1 to Teilstring.Count-1
ZielString = ZielString & TrennString & TeilString(I)
Next I
Beim "Original-"Split dürfte man hier nur Mid(TrennString,1,1) nehmen.
LG, Dennis.
-
Hallo Dennis,
was Du da schreibst, kann ich nicht nachvollziehen.
Schon gar nicht für die von .NET implementierte Version von Split, auf die ich oben verwiesen hatte. Und da man allgemein .NET Methoden vorziehen sollte, wenn sie vergleichbares leisten, da sie die Portabilität erhöhen.
Aber auch Visual Basic Split, das mehr aus Kompatibilität existiert, kann mir mehreren Zeichen - wenn auch nicht mit mehreren Trennzeichen - umgehen:
Dim eingabe = "Baum<x>Haus<x>mit<x>Astloch" Dim trenner = {"<x>"} ' Bei String.Split wären mehrere möglich Dim teile = eingabe.Split(trenner, StringSplitOptions.None) Console.WriteLine("Ergebnis .NET: " & String.Join("|", teile)) Dim teile2 = Microsoft.VisualBasic.Split(eingabe, trenner(0)) Console.WriteLine("Ergebnis VB: " & String.Join("|", teile2))
getestet mit VB 2010 / .NET 4.0 - und zeigt nebenbei die einfachere Variante einer Verknüpfung via String.Join
Gruß Elmar
- Als Antwort vorgeschlagen Scriptos Sonntag, 2. Dezember 2012 12:37
-
Hi Elmar.
Dann probier dies (in einem neuen Form-Projekt, Compilereinstellung .NET 4.0 Client Profile):
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim A As String = "Baum<x>Haus<x>mit<x>Astloch" Dim B As String = "<x>" Dim Splits As List(Of String) = A.Split(B).ToList For Each C In Splits MsgBox(C) Next End Sub
Bei mir liefert dies oben genanntes Ergebnis (4 MgsBoxen):
1) Baum
2) x>Haus
3) x>mit
4) x>Astloch
Ich kann allerdings bestätigen, dass dein Code das korrekte Ergebnis liefert. Frag mich aber nicht wieso das so ist ...
LG, Dennis.
-
Hallo Dennis,
Du musst die richtige Überladung verwenden, die mit einem String-Array.
In Deinem Fall werden die Zeichen in ein Char-Array (mit "<"c, "x"c, ">"c) zerlegt. Und so kommt es zu dem Ergebnis.
Würdest Du mit Option Strict On arbeiten - was nicht nur ich hier gebetsmühlenartig immer wieder empfehle, würde Dich der Compiler darauf hinweisen ;)
Dim B() As String = {"<x>"} ' ist eh schon ein Array, ToList kann man sich sparen Dim Splits = A.Split(B, StringSplitOptions.None)
Gruß Elmar