ABAP SPLIT Anweisung erklärt: Strings am Trennzeichen aufteilen

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

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 (oft STRING oder C).
    • 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).
  • 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 dem SPLIT 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 Typ X, XSTRING).

Funktionsweise

  1. Die <quelle> wird von links nach rechts nach dem <trenner> durchsucht.
  2. Die Zeichenketten zwischen den gefundenen Trennzeichen bilden die Ergebnis-Segmente.
  3. Die Trennzeichen selbst werden entfernt und sind nicht Teil der Segmente.
  4. Wenn Trennzeichen direkt aufeinanderfolgen oder am Anfang/Ende der Quelle stehen, werden leere Segmente erzeugt.
  5. 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. wenn INTO <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 Leerzeichen
DATA 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 Trennzeichen
DATA 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.