ABAP CONDENSE: Leerzeichen entfernen – Aber Achtung bei nachfolgenden Leerzeichen!

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

Die CONDENSE-Anweisung dient dazu, überflüssige Leerzeichen aus einem zeichenartigen Datenobjekt (meistens vom Typ C - Zeichenkette fester Länge) zu entfernen. Sie modifiziert den Inhalt der angegebenen Variable direkt an Ort und Stelle (“in place”).

Konkret führt CONDENSE im Standardverhalten folgende Aktionen durch:

  1. Entfernt alle führenden Leerzeichen.
  2. Ersetzt Folgen von mehreren internen Leerzeichen (Leerzeichen zwischen sichtbaren Zeichen) durch genau ein einzelnes Leerzeichen.

Wichtig: Standardmäßig entfernt CONDENSE keine nachfolgenden Leerzeichen am Ende der Zeichenkette!

Syntax

CONDENSE <variable> [NO-GAPS].
  • <variable>: Der Name der zeichenartigen Variablen (in der Regel Typ C), deren Inhalt kondensiert werden soll.
  • [NO-GAPS] (Optional): Ein Zusatz, der das Verhalten ändert: Wenn NO-GAPS angegeben wird, werden alle Leerzeichen (führende, interne und nachfolgende) restlos aus der Variablen entfernt.

Funktionsweise im Detail

Ohne NO-GAPS (CONDENSE <variable>.)

  • " Hallo Welt " wird zu "Hallo Welt " (wenn <variable> z.B. C(30) ist. Die nachfolgenden Leerzeichen bis zur Feldlänge bleiben.)
  • " " wird zu " " (nur Leerzeichen, wird linksbündig mit Leerzeichen aufgefüllt bis zur Feldlänge)
  • " ABC " wird zu "ABC "
  • "A B C" wird zu "A B C "

Mit NO-GAPS (CONDENSE <variable> NO-GAPS.)

  • " Hallo Welt " wird zu "HalloWelt " (Rest mit Leerzeichen aufgefüllt)
  • " " wird zu " " (leeres Feld)
  • " ABC " wird zu "ABC "
  • "A B C" wird zu "ABC "

Anwendbarkeit (Typ C vs. STRING)

Typ C (Zeichenkette fester Länge): Dies ist der primäre Anwendungsfall für CONDENSE. Typ-C-Felder werden nach Zuweisungen oft rechts mit Leerzeichen aufgefüllt oder können durch Bearbeitung führende/mehrfache interne Leerzeichen enthalten. Typ STRING (Zeichenkette variabler Länge): CONDENSE kann auch auf Strings angewendet werden.

  • Das Standard-CONDENSE entfernt führende Leerzeichen und reduziert interne Mehrfach-Leerzeichen zu einem. Nachfolgende Leerzeichen, die Teil des String-Wertes sind, bleiben erhalten.
  • CONDENSE ... NO-GAPS entfernt alle Leerzeichen aus dem String.
  • Für Strings gibt es oft spezifischere und modernere Alternativen wie SHIFT ... DELETING LEADING/TRAILING space., REPLACE oder String-Templates/-Funktionen, die mehr Kontrolle bieten.

Beispiele

1. Standard CONDENSE bei Typ C

DATA text_c TYPE c LENGTH 40 VALUE ' Erster Teil zweiter Teil '.
WRITE: / 'Typ C Vorher :', |'{ text_c }'|.
CONDENSE text_c.
WRITE: / 'Typ C Nachher :', |'{ text_c }'|.

Ausgabe:

Typ C Vorher : '{ Erster Teil zweiter Teil }'
Typ C Nachher : '{Erster Teil zweiter Teil }'

(Führende Leerzeichen weg, interne auf 1 reduziert, nachfolgende Leerzeichen bleiben bis Länge 40 erhalten).

2. CONDENSE mit NO-GAPS bei Typ C

DATA text_c_ng TYPE c LENGTH 40 VALUE ' Erster Teil zweiter Teil '.
WRITE: / 'Typ C NG Vorher :', |'{ text_c_ng }'|.
CONDENSE text_c_ng NO-GAPS.
WRITE: / 'Typ C NG Nachher :', |'{ text_c_ng }'|.

Ausgabe:

Typ C NG Vorher : '{ Erster Teil zweiter Teil }'
Typ C NG Nachher : '{ErsterTeilzweiterTeil }'

(Alle Leerzeichen entfernt, der Rest ist linksbündig).

3. CONDENSE bei Typ STRING

DATA text_s TYPE string VALUE ` String mit viel Platz `.
WRITE: / 'String Vorher :', |'{ text_s }'|.
CONDENSE text_s.
WRITE: / 'String Nachher :', |'{ text_s }'|. " Führende weg, interne reduziert, nachfolgendes bleibt
DATA text_s_ng TYPE string VALUE ` String mit viel Platz `.
CONDENSE text_s_ng NO-GAPS.
WRITE: / 'String Nach NG :', |'{ text_s_ng }'|. " Alle Leerzeichen weg

Ausgabe:

String Vorher : '{ String mit viel Platz }'
String Nachher : '{String mit viel Platz }'
String Nach NG : '{StringmitvielPlatz}'

Wichtige Hinweise / Best Practice

  • CONDENSE verändert die übergebene Variable direkt. Sichern Sie den Originalwert vorher, falls er noch benötigt wird.
  • Der häufigste Irrtum ist die Annahme, CONDENSE würde nachfolgende Leerzeichen entfernen. Das ist im Standard * falsch*. Nur CONDENSE ... NO-GAPS entfernt alle Leerzeichen.
  • Zum Entfernen nur nachfolgender Leerzeichen verwendet man bei Strings SHIFT <str> RIGHT DELETING TRAILING space. oder bei Typ C z. B. die Zuweisung an einen String und zurück oder spezielle Funktionsbausteine.
  • CONDENSE ist nützlich, um Eingabefelder oder Daten aus externen Quellen zu bereinigen, die unerwünschte Leerzeichen enthalten könnten.
  • Für komplexe String-Manipulationen sind oft modernere String-Funktionen oder Operatoren die bessere Wahl als CONDENSE.