none
Die Funktion "split" RRS feed

  • 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

    Mittwoch, 28. November 2012 09:05

Antworten

Alle Antworten

  • Hallo Thomas,

    .NET's String.Split akzeptiert auch ein Zeichenfolge-Array.

    Gruß Elmar

    Mittwoch, 28. November 2012 09:14
    Beantworter
  • Hallo Elmar,

    ich habe es jetzt so gemacht:

    var_check = Split(var_row, "<Trenner>")

    Funktioniert prima.

    Danke für Deine Hilfe.

    Gruß aus Sachsenheim

    Thomas

    Mittwoch, 28. November 2012 10:14
  • 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.

    Freitag, 30. November 2012 11:11
  • 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
    Samstag, 1. Dezember 2012 16:11
    Beantworter
  • 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.

    Montag, 3. Dezember 2012 10:25
  • 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

    Montag, 3. Dezember 2012 11:03
    Beantworter