【SAP ABAP】基本構文:文字列操作(CONCATENATE、REPLACE、SPLIT、SHIFT、STRLEN、FIND、CONDENSE)

ABAP文字列操作

登場人物紹介

三崎レイナ
社会人1年目。新卒でITコンサルティングファームに就職。初配属がSAPプロジェクトにアサインされる。SAPがわからないことだらけで悩んでいたところ、会社の先輩にSAPラボの所長を紹介され、毎週末に所長とSAPのお勉強中!

博士
SAPラボの所長。SAP大好き博士!SAP導入プロジェクトを構想策定~運用保守まであらゆるフェーズを数多く経験。
いまは優しきおじいちゃんだが、プロマネバリバリの時代はかなり怖かったらしい。現在は引退し、SAPの後進育成と啓蒙活動に従事中!

この記事を読むメリット

  • ABAPでの文字列操作(CONCATENATE命令、REPLACE命令、SPLIT命令、SHIFT命令、STRLEN命令、FIND命令、CONDENSE命令)文字列操作を行えるようになります。
博士

今回はABAPの文字列操作について説明するぞい!

文字列操作は非常に重要なABAPスキルです。
ABAPには、文字列を効果的に操作するための多くの便利な機能があります。
この記事では、ABAPでよく使用されるいくつかの基本的な文字列操作方法について紹介していきます!

この記事のポイント

CONCATENATE命令(文字列の結合)

文字列の結合は、複数の文字列を1つにまとめる操作です。ABAPでは、CONCATENATE 命令を使用して文字列を結合できます。

基本の構文
 CONCATENATE a1 a2 a3… INTO 変数 [SEPARATED BY separator] [RESPECTING BLANKS].
 ※a1 a2 a3…は結合する文字列や変数を直接指定します。
 ※内部テーブルにの文字列を連結する場合は「CONCATENATE LINES OF itab INTO ~」を使用します。

SEPARATED BYオプション

SEPARATED BYオプションは、結合する各文字列やフィールドの間に特定の区切り文字を挿入するために使用されます。デフォルトでは、CONCATENATE命令は区切り文字を挿入しませんが、SEPARATED BYオプションを指定することで、任意の文字列をセパレータとして指定できます。(例:スペース、カンマ、ハイフンなど)

使用例
DATA: string1 TYPE string VALUE 'Hello',
      string2 TYPE string VALUE 'World',
      result  TYPE string.

* SEPARATED BYオプション未使用
CONCATENATE string1 string2 INTO result.
WRITE: result.  " 出力: HelloWorld
* SEPARATED BYオプション使用
CONCATENATE string1 string2 INTO result SEPARATED BY space.
WRITE: / result.  " 出力: Hello World

このプログラムでは、string1とstring2を結合し、その間にスペースを挿入しています。

実行結果

CONCATENATE(SEPARATED-BY)実行結果

RESPECTING BLANKSオプション

通常、文字列の結合時に末尾にある空白が削除される場合があります。しかし、RESPECTING BLANKSオプションを指定することで、空白をそのまま保持して結合できます。

使用例
TYPES: text   TYPE c LENGTH 6.
DATA:  result TYPE c LENGTH 30,
       itab   TYPE TABLE OF text.

APPEND 'Hello' TO itab.
APPEND 'world' TO itab.
APPEND 'this'  TO itab.
APPEND 'is'    TO itab.
APPEND 'test'  TO itab.

* オプション使用無し
CONCATENATE LINES OF itab INTO result.
WRITE: result.
* SEPARATED BYオプション使用
CONCATENATE LINES OF itab INTO result SEPARATED BY space.
WRITE: / result.
* RESPECTING BLANKSオプション使用
CONCATENATE LINES OF itab INTO result RESPECTING BLANKS.
WRITE: / result.

このプログラムでは、文字列型テーブル itab に5つの文字列(’Hello’, ‘world’, ‘this’, ‘is’, ‘test’)を格納し、CONCATENATE 命令を使用してそれらの要素を1つの文字列 result に結合しています。
最初に CONCATENATE LINES OF itab INTO result. によって、テーブル内の要素が空白なしで結合され、次に CONCATENATE LINES OF itab INTO result SEPARATED BY space. によって、各要素が空白で区切られて結合されます。最後に CONCATENATE LINES OF itab INTO result RESPECTING BLANKS. では、各文字列の元の空白が維持されたまま結合されることを確認できます。

実行結果

CONCATENATE(RESPECTING-BLANKS)実行結果

REPLACE命令(文字列の置換)

REPLACE命令は、文字列内の特定の部分文字列を別の文字列に置き換えるために使用されます。特定のパターンを見つけ、それを新しいパターンに置き換える操作が可能です。

基本の構文
 REPLACE [ALL OCCURRENCES OF | FIRST OCCURRENCE OF] 検索する文字列 IN 置換対象の文字列 WITH 置換用の文字列.

使用例
DATA: text TYPE string VALUE 'Hello ABAP World',
      pattern TYPE string VALUE 'ABAP',
      replacement TYPE string VALUE 'SAP'.

REPLACE pattern IN text WITH replacement.
WRITE: text.  " 出力: Hello SAP World

このプログラムでは、文字列「Hello ABAP World」の中の「ABAP」を「SAP」に置き換えています。

実行結果

REPLACE実行結果

ALL OCCURRENCES OF | FIRST OCCURRENCE OFオプション

ALL OCCURRENCES OFオプションを使用すれば、一致するすべての文字列を置き換えます。一方、FIRST OCCURRENCE OFオプションを使用すれば、最初に一致した文字列のみを置き換えます。指定しない場合は、FIRST OCCURRENCE OFオプションがデフォルトで適用されます。

使用例
DATA: text TYPE string.

* FIRST OCCURRENCE OFオプションを使用
text = 'apple banana apple'.
REPLACE FIRST OCCURRENCE OF 'apple' IN text WITH 'orange'.
WRITE: / text.  " 結果: "orange banana apple"

* ALL OCCURRENCES OFオプションを使用
text = 'apple banana apple'.
REPLACE ALL OCCURRENCES OF 'apple' IN text WITH 'orange'.
WRITE: / text.  " 結果: "orange banana orange"

このプログラムでは、文字列操作において REPLACE 命令の FIRST OCCURRENCE OF と ALL OCCURRENCES OF オプションを使用して、文字列内の部分文字列を置き換えています。最初に FIRST OCCURRENCE OF を使用し、文字列 text に含まれる最初の ‘apple’ を ‘orange’ に置き換えています。次に、ALL OCCURRENCES OF を使用して、文字列内に含まれるすべての ‘apple’ を ‘orange’ に置き換え、両方の ‘apple’ が ‘orange’ に変更されています。

実行結果

REPLACE(ALL-OCCURRENCES-OF、FIRST-OCCURRENCE-OF)実行結果

SPLIT命令(文字列の分割)

SPLIT命令は、文字列を特定の区切り文字で分割し、分割された部分を別々の変数や内部テーブルに格納するために使用されます。ABAPでは、SPLIT命令を使用して、文字列内のデータを個々の要素に分割し、より細かく操作することができます。

基本の構文
 SPLIT 文字列 AT 区切り文字 INTO 変数1 変数2 変数3 ….
 ※区切り文字については、文字列を分割する際に使用される文字や文字列を指定します。
  変数1 変数2 変数3 …は、分割された各部分を格納する変数を指定します。

使用例
DATA: text TYPE string VALUE 'Apple,Orange,Banana',
      fruit1 TYPE string,
      fruit2 TYPE string,
      fruit3 TYPE string.

SPLIT text AT ',' INTO fruit1 fruit2 fruit3.
WRITE: / fruit1,  " 出力: Apple
       / fruit2,  " 出力: Orange
       / fruit3.  " 出力: Banana

このプログラムでは、text変数内の文字列’Apple,Orange,Banana’をカンマで区切り、それぞれをfruit1、fruit2、およびfruit3に格納しています。

実行結果

SPLIT(INTO)実行結果

INTO TABLEオプション

INTO TABLEオプションを使用すると、分割された文字列の各部分を内部テーブルに格納することができます。このオプションは、分割後の要素数が不定の場合や、多くの要素を処理する必要がある場合に便利です。

使用例
DATA: text TYPE string VALUE 'Red;Green;Blue;Yellow',
      color_table TYPE TABLE OF string WITH EMPTY KEY.

SPLIT text AT ';' INTO TABLE color_table.
LOOP AT color_table INTO DATA(color).
  WRITE: / color.
ENDLOOP.

このプログラムでは、text変数内の文字列’Red;Green;Blue;Yellow’をセミコロンで区切り、それぞれを内部テーブルcolor_tableに格納しています。その後、テーブルの各要素をループで出力しています。

実行結果

SPLIT(INTO TABLE)実行結果

SHIFT命令(文字列のシフト)

文字列全体を左または右にシフト(移動)させるための命令です。指定した文字数だけ文字列をシフトし、シフトによって空いた部分にはスペースが埋められます。この命令は、文字列の先頭や末尾から特定の文字を削除したい場合や、文字列を整形したい場合に有用です。

基本の構文
 SHIFT 文字列 [BY n PLACES] [LEFT | RIGHT | CIRCULAR].
 ※nについてはシフトする文字数を指定します。
 ※LEFT:位置がn個分左に移動され、右端に移動した分の空白が追加される
  RIGHT:位置がn個分右に移動され、左端に移動した分の空白が追加される
CIRCULAR:シフトされた文字を文字列の反対側に移動される(文字列全体を回転させる)
  (指定しない場合はLEFTが設定されます。)

使用例
DATA:
  lv_text  TYPE char10 VALUE 'ABCDEF1234',
  lv_text1 TYPE char10,
  lv_text2 TYPE char10,
  lv_text3 TYPE char10,
  lv_text4 TYPE char10.

lv_text1 = lv_text.
lv_text2 = lv_text.
lv_text3 = lv_text.
lv_text4 = lv_text.

SHIFT lv_text1.
SHIFT lv_text2 BY 3 PLACES LEFT.
SHIFT lv_text3 BY 3 PLACES RIGHT.
SHIFT lv_text4 BY 3 PLACES CIRCULAR.

WRITE: / 'Original Text: ', lv_text,
       / 'lv_text1 (Shift Left by 1): ', lv_text1,
       / 'lv_text2 (Shift Left by 3): ', lv_text2,
       / 'lv_text3 (Shift Right by 3): ', lv_text3,
       / 'lv_text4 (Shift Circular by 3): ', lv_text4.

このプログラムでは、文字列’ABCDEF1234’を使用して、ABAPのSHIFT命令の動作を示しています。lv_text1はデフォルトで1文字左にシフトされ、lv_text2は3文字左にシフト、lv_text3は3文字右にシフト、そしてlv_text4は3文字循環シフトされます。最後に、元の文字列とそれぞれのシフト結果が出力されます。

実行結果

SHIFT実行結果

STRLEN命令(文字列の長さ取得)

STRLEN命令は、指定された文字列の長さを取得するために使用されるABAPの関数です。文字列の長さを確認することで、文字列操作やデータ検証などに利用することができます。STRLENは文字列の中の文字数を返し、バイト数ではなく文字数をカウントするため、マルチバイト文字列でも正確に長さを取得できます。

基本の構文
 STRLEN (文字列).

使用例
DATA: text TYPE string VALUE 'ABAP Programming',
      length TYPE i.

length = STRLEN( text ).
WRITE: 'Length:', length.  " 出力: Length: 16

このプログラムでは、text変数に格納されている文字列の長さをlengthに格納し、出力しています。textには’ABAP Programming’という文字列が含まれており、その長さである16が出力されます。

実行結果

STRLEN実行結果

FIND命令(文字列の検索)

FIND命令は、指定された文字列内で特定の部分文字列を検索するために使用されるABAPのコマンドです。文字列操作において、特定のパターンやキーワードが含まれているかどうかをチェックしたり、その位置を取得したりするために使用されます。

基本の構文
 FIND [FIRST OCCURRENCE | ALL OCCURRENCES] (文字列) IN text [MATCH OFFSET 変数] [MATCH COUNT 変数] [MATCH LENGTH 変数].

FIRST OCCURRENCE | ALL OCCURRENCESオプション

FIRST OCCURRENCEオプションは、検索対象の文字列内で最初に一致した部分文字列のみを検索します。指定しない場合は、FIRST OCCURRENCEオプションがデフォルトで適用されます。
ALL OCCURRENCESオプションは、検索対象の文字列内で一致するすべての部分文字列を検索します。このオプションを指定することで、検索対象文字列のすべての一致箇所を取得することができます。

使用例
DATA: text     TYPE string VALUE 'apple banana apple grape banana apple',
      word     TYPE string VALUE 'apple',
      offset   TYPE i,
      count    TYPE i.

* FIRST OCCURRENCE OFオプションを使用
FIND FIRST OCCURRENCE OF word IN text MATCH OFFSET offset.

IF sy-subrc = 0.
  WRITE: / 'First occurrence of "', word, '" is at offset:', offset.  " 結果: 0
ELSE.
  WRITE: / 'Pattern not found.'.
ENDIF.

* ALL OCCURRENCES OFオプションを使用
FIND ALL OCCURRENCES OF word IN text MATCH COUNT count.

WRITE: / 'Total occurrences of "', word, '":', count.  " 結果: 3

このプログラムでは、最初に FIND FIRST OCCURRENCE OF を使用して ‘apple’ が最初に出現する位置を取得し、そのオフセット(開始位置)を表示します。この例では、’apple’ は文字列の先頭にあるため、オフセットは 0 です。次に、FIND ALL OCCURRENCES OF を使用して ‘apple’ の全出現回数を取得し、結果として 3 回出現していることがわかります。

実行結果

FIND(FIRST-OCCURRENCE、ALL-OCCURRENCES)実行結果

MATCH OFFSET | MATCH COUNT | MATCH LENGTHオプション

MATCH OFFSETオプションは、一致した部分文字列の開始位置(オフセット)を取得するオプションです。オフセットは、検索対象文字列の先頭から何文字目に一致したかを示す数値です。

MATCH COUNTオプションは、一致した部分文字列の総数を取得するオプションです。検索対象の文字列内で、指定したパターンがいくつ見つかったかを示します。

MATCH LENGTHオプションは、一致した部分文字列の長さを取得するオプションです。検索対象の文字列内で、指定したパターンが一致した部分の文字数を示します。

使用例
DATA: text   TYPE string VALUE 'apple banana apple grape apple',
      word   TYPE string VALUE 'apple',
      offset TYPE i,
      count  TYPE i,
      length TYPE i.

* 最初の 'apple' の出現位置と長さを取得
FIND FIRST OCCURRENCE OF word IN text
     MATCH OFFSET offset
     MATCH LENGTH length.

IF sy-subrc = 0.
  WRITE: / 'First occurrence of "', word, '" found: '.
  WRITE: / '  - Offset:', offset, ' Length:', length.
ELSE.
  WRITE: / 'Pattern not found.'.
ENDIF.

* すべての 'apple' の出現回数を取得
FIND ALL OCCURRENCES OF word IN text MATCH COUNT count.

WRITE: / 'Total occurrences of "', word, '":', count.

このプログラムでは、文字列 text 内における特定の単語 word (‘apple’) の最初の出現位置およびその長さ、さらにすべての出現回数を取得して表示しています。まず、FIND FIRST OCCURRENCE OF 命令を使用して、’apple’ が最初に現れる位置 (offset) とその単語の長さ (length) を取得し、その結果を表示します。次に、FIND ALL OCCURRENCES OF 命令を使って、文字列全体における ‘apple’ の出現回数 (count) を取得し、その回数を表示しています。

実行結果

FIND(MATCH-OFFSET、MATCH-COUNT、MATCH-LENGTH)実行結果

CONDENSE命令(文字列の空白削除)

CONDENSE命令は、文字列から余分な空白を削除するために使用されるABAPのコマンドです。この命令を使用すると、文字列内の連続する複数の空白を1つの空白に置き換えたり、文字列の先頭および末尾にある空白を削除したりできます。入力データの整形や出力のフォーマットを整えるためによく使用されます。

基本の構文
 CONDENSE 文字列 [NO-GAPS].

使用例
DATA: text TYPE string VALUE '  ABAP   Programming  '.

CONDENSE text.
WRITE: '"' && text && '"'.  " 出力: "ABAP Programming"

このプログラムでは、text変数の中にある先頭と末尾の空白が削除され、内部の連続する空白も1つの空白に縮小されています。出力は”ABAP Programming”となります。

実行結果

CONDENSE実行結果

NO-GAPSオプション

NO-GAPSオプションを使用すると、文字列内のすべての空白を完全に削除します。このオプションを使うことで、文字列内のスペースが必要ない場合や、データのクリーニングを行う場合に有効です。

まとめ

ABAPでの文字列操作における基本的な命令であるCONCATENATE、REPLACE、SPLIT、SHIFT、STRLEN、FIND、およびCONDENSEについて説明しました。
これらの命令を活用することで、文字列の結合、分割、シフト、長さの取得、特定の文字列の検索、そして余分な空白の削除といった操作が効率的に行えます。ABAPプログラミングにおいて、これらの文字列操作はデータ処理の重要な部分を担っており、適切に使用することで、コードの可読性とメンテナンス性を向上させることができます。今後の開発において、これらの命令を活用し、より効果的なプログラムを作成していきましょう。

★★★SAPラボのライター募集★★★

SAPラボでは、SAPの知識を活かして副業をしたい方を募集してるのじゃ!

SAPラボのライターの特徴

・ライティング初心者OK!
・報酬高単価!
・業務委託契約なので副業として最適!

SAP記事執筆者としての活動実績として利用可能なので、転職時や案件探しの際に企業へのアピール材料にもなります。

募集要項

・SAP導入や運用保守プロジェクトへの参画経験1年以上

ご応募/お問合せ先

info@sap-labo.com

少しでもご興味ある方、ぜひお気軽にご連絡下さい!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

新卒でSAPエンジニアとしてABAPでの新規開発や保守業務を担当。
業務内容としてはロジ系(MM/SD)がメインで、ABAPの開発が最も得意。

この記事のポイント