文字列の分割を行うSPLIT命令について1分で解説します。
SPLIT命令を用いることで、文字列を分割して複数の変数への代入(内部テーブルへの追加)が可能になります。
ABAPerであれば知っておきたい重要知識です。是非最後までご覧ください。
SPLIT命令の処理内容
SPLIT命令は、指定した文字列を区切りとして変数の値を分割する命令です。変数a の値を区切り文字「/」で分割した場合のイメージ図がこちら。
変数a は「/」(スラッシュ)を複数含む文字列を格納している状況。ここで、SPLIT命令を用いてスラッシュ単位で変数b~変数eに分割して格納していきます。
決して難しい処理ではありませんね。
早速、構文ルールを学習していきましょう。
パターン1:分割結果を変数に代入する
SPLIT(変数)AT(区切り文字)INTO(変数1)(変数2)・・・
DATA LV_TEST(15) TYPE C VALUE 'ABC/DEF/GHI/JKL'. * /区切りで分割する SPLIT LV_TEST AT '/' INTO LV_ABC LV_DEF LV_GJI LV_JKL. WRITE LV_DEF. " ⇒ DEF が表示される
変数 "LV_TEST" の値が、「/」で区切られそれぞれの変数に代入されます。区切り文字が1つも見つからない場合は、最初の変数にすべての文字列が格納されることになります。
尚、下記のように代入先の変数の数が少ない場合(文字列が分割しきれない場合)は、分割されずに最後の変数に代入が行われます。
期待する結果に応じた数の変数を用意しておく必要があります。
DATA LV_TEST(15) TYPE C VALUE 'ABC/DEF/GHI/JKL'. * /区切りで分割する SPLIT LV_TEST AT '/' INTO LV_ABC LV_DEF. WRITE LV_DEF. " ⇒ DEF/GHI/JKL が表示される
尚、例えば変数の最初にスラッシュが来た場合は、以下のように最初の変数の値はブランクとなります。
SPLIT命令は、実は結構奥が深い命令なので注意が必要です。
DATA LV_TEST(15) TYPE C VALUE '/ABC/DEF'. * /区切りで分割する SPLIT LV_TEST AT '/' INTO LV_ABC LV_DEF. WRITE LV_ABC. " ⇒ 何も表示されない(ブランク)
パターン2:分割結果を内部テーブルに代入する
また、格納結果を変数に代入するのではなく、内部テーブルに格納することも可能です。
SPLIT(変数)AT(区切り文字)INTO TABLE(内部テーブル).
DATA LV_TEST(15) TYPE C VALUE 'ABC/DEF/GHI/JKL'. * 結果格納用内部テーブル DATA LT_TEST TYPE TABLE OF test. * /区切りで分割する SPLIT LV_TEST AT '/' INTO LT_TEST. DESCRIBE TABLE LT_TEST LINES a. WRITE a. " ⇒結果は「4」
分割結果を変数に格納していく場合、結果の分だけ変数を定義しておく必要がありますが、内部テーブルを利用すれば結果がいくつになっても問題ありません。
利用シーンに応じた使い分けが重要です。
変数と内部テーブルの違いが分からないという方は以下の記事をご覧ください。
サンプルコード中で利用した「DESCRIBE TABLE」命令は指定した内部テーブルの属性を読みとる命令です。
詳しくは下記のページで解説おりますのでこの機会に合わせて学んでおきましょう。
リターンコード:SY-SUBRC
SPLIT命令では、ショートダンプなどが発生しないためエラーハンドリングをしておくことが重要です。
下記の通り処理結果に応じてSY-SUBRCの値が入れ替わりますので、その結果に応じて分岐をいれておくことをおすすめします。
DATA LV_TEST(15) TYPE C VALUE 'ABC/DEF/GHI'. * /区切りで分割する SPLIT LV_TEST AT '/' INTO LV_ABC LV_DEF. IF SY-SUBRC <> 0. WRITE LV_DEF. " ⇒ DEF/GHI ENDIF.
SAP / ABAPを1から学習したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!