Dienstag, 30. September 2014

ABAP - Leerzeichen in String finden mit FIND

Wenn man alle Leerzeichen in einem String finden möchte - um zum Beispiel die Wörter in einem Satz zu bestimmen - dann steht man vor einem Problem. Die Anweisung FIND ALL OCCURRENCES OF <space oder ' '> IN <string> RESULTS <Tabelle mit Positionsangaben> führt zu einem Laufzeitfehler da space oder ' ' die Länge 0 hat und so eine Endlosschleife ausgelöst würde.
Man könnte nun die Leerzeichen maskieren - unter Verwendung von OVERLAY - oder auch den String aufsplitten, aber es geht noch viel einfacher.

Durch die Verwendung von ` `, des sogenannten "Backticks" oder "Backquotes" - die deutsche Bezeichnung wäre Gravis oder rückwärts geneigtes Hochkomma - kann ein Stringliteral definiert werden, das als Leerzeichen interpretiert wird.

REPORT  ztestfind.

DATA: testsatz(50) TYPE c VALUE 'Das ist ein Test des Befehls FIND'.
DATA: l_find_result TYPE TABLE OF match_result.
DATA: wa_find_result TYPE match_result.
DATA: len TYPE i.

len = strlen( testsatz ).
FIND ALL OCCURRENCES OF ` ` IN testsatz(len) RESULTS l_find_result.
LOOP AT l_find_result INTO wa_find_result.
  WRITE:/ wa_find_result-offset.
ENDLOOP.

In dem Beispiel wird zusätzlich auf die tatsächliche Länge des Strings abgefragt mit STRLEN da sonst natürlich auch die Position der abschließenden Leerzeichen ausgegeben wird.

Kommentare:

  1. Das Problem ist, daß bei Wörtern in einfachen Hochkommas Leerzeichen am Ende automatisch entfernt werden.
    Bsp:
    data: gv_word type c length 5.
    gv_word = 'abc '. perform do.
    gv_word = ' abc '. perform do.
    gv_word = ' abc'. perform do.
    form do.
    data: lv_length type i.
    lv_length = strlen( gv_word ).
    write: / 'Length of "', gv_word, '" is:', lv_length.
    endform.

    Ausgabe:
    Length of " abc " is: 3
    Length of " abc " is: 4
    Length of " abc " is: 5

    Macht man das ganze mit einem String:
    data: gv_word type string.
    gv_word = `abc `. perform do.
    gv_word = ` abc `. perform do.
    gv_word = ` abc`. perform do.
    form do.
    data: lv_length type i.
    lv_length = strlen( gv_word ).
    write: / 'Length of "', gv_word, '" is:', lv_length.
    endform.

    ist die Ausgabe:

    Length of " abc " is: 5
    Length of " abc " is: 5
    Length of " abc " is: 5

    Da Strings in Abap mit den Backticks definiert werden, ist in deinem Beispiel
    FIND ALL OCCURRENCES OF ` ` IN ....
    tatsächlich eine Zeichenkette mit genau einem Leerzeichen vorhanden.

    AntwortenLöschen
    Antworten
    1. Hallo,
      vielen Dank für die Ergänzung. Die abschliessenden Leerzeichen werden bei strlen und einem Charakterfeld nicht mitgezählt, das stimmt. Ohne die Längenbeschränkung gibt der FIND in dem Charakter 50 Feld auch den Offset der abschliessenden Leerzeichen aus. Bei einem Feld vom Type string - das ja keine feste Länge hat - macht das System das nicht. Wenn ich allerdings in Deinem Beispiel mit den Backticks mit FIND ALL OCCURRENCES... nach den Leerzeichen suche dann bekomme ich die Offsets 3 und 4 für das erste Beispiel, 0 und 4 für das zweite und 0 und 1 für das dritte.

      Viele Grüße

      Armin

      Löschen