Die SPLIT
-Anweisung dient dazu, eine zeichenartige Variable (z. B. einen String oder ein Feld vom Typ C) anhand
eines festgelegten TrennZeichens (Delimiter) in mehrere Teilzeichenketten (Segmente) aufzuteilen. Das Ergebnis
dieser Aufteilung kann entweder in einzelne Variablen oder – was oft praktischer ist – in die Zeilen einer internen
Tabelle geschrieben werden.
Syntax
SPLIT <quelle> AT <trenner> INTO { {<ziel1> <ziel2> ...} | {TABLE <zieltabelle>} } [IN CHARACTER MODE | IN BYTE MODE].
SPLIT <quelle>
: Gibt die zeichenartige Variable (oder ein Literal) an, die aufgeteilt werden soll.AT <trenner>
: (Obligatorisch) Gibt das Zeichen oder die Zeichenkette (Literal oder Variable) an, das/die als Trennzeichen dient. An jedem Vorkommen dieses Trennzeichens wird die Quelle geteilt.INTO <ziel1> <ziel2> ...
: Eine Möglichkeit, die Ergebnisse zu empfangen. Die gefundenen Segmente werden nacheinander in die Variablen<ziel1>
,<ziel2>
usw. geschrieben. Diese sollten ebenfalls zeichenartig sein (oftSTRING
oderC
).- Verhalten: Wenn mehr Segmente gefunden werden als Zielvariablen vorhanden sind, wird der gesamte Rest der
Quelle (inklusive verbleibender Trennzeichen!) in die letzte angegebene Zielvariable geschrieben. Wenn weniger
Segmente gefunden werden, werden die überzähligen Zielvariablen auf ihren Initialwert zurückgesetzt (
CLEAR
).
- Verhalten: Wenn mehr Segmente gefunden werden als Zielvariablen vorhanden sind, wird der gesamte Rest der
Quelle (inklusive verbleibender Trennzeichen!) in die letzte angegebene Zielvariable geschrieben. Wenn weniger
Segmente gefunden werden, werden die überzähligen Zielvariablen auf ihren Initialwert zurückgesetzt (
INTO TABLE <zieltabelle>
: Die flexiblere Methode. Jedes gefundene Segment wird als neue Zeile in die interne Tabelle<zieltabelle>
geschrieben. Die Tabelle sollte einen passenden zeichenartigen Zeilentyp haben (z. B.STANDARD TABLE OF string
). Wichtig: Die Zieltabelle wird vor demSPLIT
automatisch geleert (CLEAR
)!IN CHARACTER MODE
: (Standard für zeichenartige Quelle/Trenner) Verarbeitet die Daten zeichenweise.IN BYTE MODE
: Verarbeitet die Daten byteweise (nötig für TypX
,XSTRING
).
Funktionsweise
- Die
<quelle>
wird von links nach rechts nach dem<trenner>
durchsucht. - Die Zeichenketten zwischen den gefundenen Trennzeichen bilden die Ergebnis-Segmente.
- Die Trennzeichen selbst werden entfernt und sind nicht Teil der Segmente.
- Wenn Trennzeichen direkt aufeinanderfolgen oder am Anfang/Ende der Quelle stehen, werden leere Segmente erzeugt.
- Die Segmente werden entweder in die Zielvariablen oder als Zeilen in die Zieltabelle geschrieben.
Systemfeld sy-subrc
sy-subrc = 0
: Wird in den allermeisten Fällen gesetzt, auch wenn der Trenner gar nicht gefunden wurde (dann landet die gesamte Quelle im ersten Ziel) oder wenn leere Segmente erzeugt wurden.sy-subrc = 4
: Kann in seltenen Fällen auftreten, z. B. wennINTO <ziel1>
verwendet wird, der Trenner nicht gefunden wurde und die Quelle länger ist als<ziel1>
aufnehmen kann.- Empfehlung: Verlasse Dich nicht zu sehr auf
sy-subrc
. Prüfe stattdessen direkt die Ergebnisse (z. B.lines( zieltabelle )
oder den Inhalt der Zielvariablen).
Beispiele
1. Komma-separierten String in Variablen zerlegen
DATA lv_csv TYPE string VALUE 'Müller,Petra,Hamburg'.DATA: lv_name TYPE string, lv_vorname TYPE string, lv_stadt TYPE string.
SPLIT lv_csv AT ',' INTO lv_name lv_vorname lv_stadt.
WRITE: / 'Name :', lv_name, " -> Müller / 'Vorname:', lv_vorname, " -> Petra / 'Stadt :', lv_stadt. " -> Hamburg
2. Einen Satz in Wörter in eine Tabelle zerlegen
DATA lv_sentence TYPE string VALUE 'Ein Beispiel mit Leerzeichen'. " Mehrfache LeerzeichenDATA lt_words TYPE STANDARD TABLE OF string.
SPLIT lv_sentence AT space INTO TABLE lt_words. " space ist Konstante für ' '
LOOP AT lt_words INTO DATA(lv_word). WRITE / 'Segment:', |'{ lv_word }'|. " Beachte die leeren Segmente!ENDLOOP.
Ausgabe:
Segment: 'Ein'Segment: ''Segment: ''Segment: 'Beispiel'Segment: ''Segment: 'mit'Segment: ''Segment: 'Leerzeichen'
3. Umgang mit mehr Segmenten als Zielvariablen
DATA lv_parts TYPE string VALUE 'Teil1-Teil2-Teil3-Teil4'.DATA: lv_p1 TYPE string, lv_p2 TYPE string. " Nur 2 Zielvariablen
SPLIT lv_parts AT '-' INTO lv_p1 lv_p2.
WRITE: / 'P1:', lv_p1, " -> Teil1 / 'P2:', lv_p2. " -> Teil2-Teil3-Teil4 (Rest landet hier!)
4. Leere Segmente demonstrieren
DATA lv_data TYPE string VALUE '|WertA||WertC|'. " Fehlender Wert B, führendes/nachfolgendes TrennzeichenDATA lt_segments TYPE STANDARD TABLE OF string.
SPLIT lv_data AT '|' INTO TABLE lt_segments.
LOOP AT lt_segments INTO DATA(lv_segment). WRITE / sy-tabix, '. Segment:', |'{ lv_segment }'|.ENDLOOP.
Ausgabe:
1 . Segment: '' 2 . Segment: 'WertA' 3 . Segment: '' 4 . Segment: 'WertC' 5 . Segment: ''
Wichtige Hinweise / Best Practice
SPLIT
verändert die ursprüngliche Quellvariable nicht.- Die Trennzeichen gehen bei der Aufteilung verloren.
- Sei Dir bewusst, dass leere Segmente entstehen können.
- Die Verwendung von
INTO TABLE
ist in der Regel flexibler und robuster, da Du Dir keine Gedanken über die genaue Anzahl der Segmente machen musst. Die Tabelle wird vor der Verwendung immer automatisch initialisiert ( geleert). SPLIT
ist sehr nützlich für das Parsen von einfachen strukturierten Daten wie CSV-Zeilen oder Pfadangaben.