ABAP 文字列の検索:FIND命令

  データ定義&編集

概要

FIND命令は特定の文字が含まれているかを検索し、含まれている場合はその文字の位置を返す命令だ。

サンプルコード:検索のみ

DATA: V_TEXT TYPE String.

V_TEXT = 'AAAAFINDBBBBB'.

FIND 'FIND' IN V_TEXT.
IF SY-SUBRC = 0.
  WRITE 'OK'.
ENIDF.

説明

当例ではFIND命令を使用し、変数:V_TEXTから’FIND’という文字があるかをチェックしている。システム変数:SY-SUBRCには見つける事ができたら’0’が返り、見つける事ができなかった場合は’4’が返ってくる為、それぞれの処理をIF文等で分岐してから記述する事ができる。

サンプルコード:検索位置を返す

DATA: V_TEXT TYPE String,
      V_OFF TYPE I,
      V_CNT TYPE I.

V_TEXT = 'AAAAFINDBBBBB'.

FIND 'FIND' IN V_TEXT MATCH OFFSET V_OFF MATCH LENGTH V_LEN.
IF SY-SUBRC = 0.
  WRITE V_TEXT+V_OFF(V_LEN).
ENIDF.

説明

当例ではFIND命令を使用し、変数:V_TEXTから’FIND’という文字が見つかれば見つかった位置と長さを返すという命令になる。さきほどと同様にシステム変数:SY-SUBRCをチェックし、見つかった場合には、見つけた文字だけを切り取り画面へ出力するという例を記述している。

サンプルコード:複数検索

DATA: V_TEXT TYPE String,
      V_LEN TYPE I.

V_TEXT = 'AAAAFINDBBBBBFINDCCC'.

FIND ALL OCCURRENCES OF 'FIND' IN V_TEXT MATCH COUNT V_CNT.
IF SY-SUBRC = 0.
  WRITE V_CNT.
ENIDF.

説明

当例ではFIND命令を使用し、変数:V_TEXTから’FIND’という文字を全て検索するという命令になる。例では2回FINDという文字を見つける事ができる為、変数:V_CNTには2がセットされる。

FIRST OCCURRENCESが1回の検索、ALL OCCURRENCESが全ての検索となる。上記の2例では省略したが、記述を省略した場合にはFIRST OCCURRENCESとなる。

サンプルコード:結果を内部テーブルへ格納

DATA: V_TEXT TYPE String,
      result_tab TYPE match_result_tab.

V_TEXT = 'AAAAFINDBBBBBFINDCCC'.

FIND ALL OCCURRENCES OF 'FIND' 
IN V_TEXT 
RESULTS result_tab.

説明

正直用途は思い浮かばないが、RESULTSの後に内部テーブルを指定する事で結果を内部テーブルへ格納する事が可能だ。1行目には最初に見つけた文字の位置、桁数等、2行目には次に見つけた文字の位置、桁数等が格納されている。内部テーブルをループしてそれぞれの文字に対して処理する事ができる。

サンプルコード:内部テーブルから文字列を検索

DATA: itab TYPE TABLE OF string.

FIND ALL OCCURRENCES OF 'FIND'
IN TABLE itab
RESPECTING CASE
RESULTS result_tab.

説明

上記例のように検索対象として内部テーブルを指定する事もできる。ファイルを読み込んだ後の内部テーブル等に使用可能と思われる。ただ、Loopして一行ずつ検索する事も可能なので、パフォーマンスやロジックの簡素化を考えて利用する構文かもしれない。

まとめ

今回はFIND命令を紹介したが、文字の中から特定の記述がある場合だけ、”こうしたい”といった要件は少なくないはずだ。XML等を扱っている場合は、タグの名前で判断する事が多い為、よく使用されるだろう。また、各テキスト(受注や、購買伝票上に設定する)でも、ユーザーが入力するテキストを抽出し、加工する際等に特定の文字を探す構文としても使用可能だろう。