【入門編】TRANSLATE関数による文字変換テーブルの適用とマッピング – PL/Iの基本構文とデータ制御実践ガイド

こんにちは。IBMメインフレームの世界へようこそ。

「PL/I? なんだか古めかしい名前だな…」と身構える必要はありません。PL/Iは、COBOLのビジネスライクな柔軟さと、C言語のような数理計算の緻密さを併せ持つ、非常に「懐の深い」言語です。

今日は、メインフレームでのデータ加工において避けては通れない「TRANSLATE関数」について、現場の知見を交えて優しく紐解いていきましょう。

1. PL/Iの基本の「き」:プログラムの骨格

まず、PL/Iのプログラムは「部屋(PACKAGE)」の中に「主役(PROCEDURE)」がいるような構成をしています。

/i
/ プログラムの入り口はここから /
MY_PROGRAM: PACKAGE;

/ メイン処理の宣言。OPTIONS(MAIN)は「ここが実行開始地点だよ」という合図 /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);

/ 変数宣言はDCL(DECLARE)を使います /
DCL INPUT_DATA CHAR(10) INIT(‘ABC123XYZ’);

/ ここに処理を書いていきます /

END MAIN_PROC;
END MY_PROGRAM;

JavaのクラスやCOBOLのIDENTIFICATION DIVISIONに相当するものですが、PL/Iは「手続きの塊」を記述する感覚に近いです。

2. TRANSLATE関数で文字を「魔法のように」変える

さて、本題の`TRANSLATE`関数です。これは、指定した文字列の中にある特定の文字を、別の文字に一括置換する関数です。

構文のイメージ

`TRANSLATE(対象文字列, 変換後リスト, 変換前リスト)`

これだけだと少し分かりにくいですよね。例えば、「A」を「1」に、「B」を「2」に変えたい場合、こう書きます。

/i
DCL TARGET_STR CHAR(5) INIT(‘ABABA’);
DCL RESULT_STR CHAR(5);

/ ‘ABABA’ の中の ‘A’ を ‘1’ に、’B’ を ‘2’ に変換する /
RESULT_STR = TRANSLATE(TARGET_STR, ’12’, ‘AB’);

結果、`RESULT_STR`には `’12121’` が格納されます。まさに「翻訳(Translate)」という名前の通り、辞書を引くようなイメージですね。

3. 現場で役立つ「変換テーブル」の考え方

実務では、小文字を大文字に変換したり、特定の特殊文字をスペースに置換したりする際によく使います。ここで、メインフレームならではの注意点があります。

EBCDICコードという「壁」

メインフレームの多くはEBCDICという文字コードを使っています。ASCII(Javaなどで一般的)とは文字の並び順が異なります。

特に気をつけてほしいのは、「変換前リスト」と「変換後リスト」の長さが一致しない場合です。

  • もし「変換後リスト」が「変換前リスト」より短い場合、足りない分は「変換前リスト」の最後の文字で埋められます。
  • 逆に長い場合は、溢れた分は無視されます。

現場のトラブルとして多いのが、「変換リストの長さが足りずに、意図しない文字に化けてしまう」というケースです。必ずペアになるように定義してくださいね。

4. 実践的なサンプルコード

実際に、小文字を大文字に変換しつつ、特定の記号を削除するような汎用的な処理を書いてみましょう。

/i
TRANS_SAMPLE: PROCEDURE OPTIONS(MAIN);

DCL WORK_STR CHAR(20) INIT(‘abc-def,ghi’);
DCL CLEAN_STR CHAR(20);

/

  • 第2引数: 変換先の文字リスト
  • 第3引数: 変換元の文字リスト
  • ここでは、小文字を大文字へ変換し、
  • ‘-‘ や ‘,’ をスペースに置き換えています

/
CLEAN_STR = TRANSLATE(WORK_STR,
‘ABC DEF GHI’,
‘abc-def,ghi’);

PUT SKIP LIST(‘元データ: ‘ || WORK_STR);
PUT SKIP LIST(‘変換後 : ‘ || CLEAN_STR);

END TRANS_SAMPLE;

最後に:怖がらなくて大丈夫です

「こんな古い言語、覚えられるかな?」と不安に思うかもしれません。でも、PL/Iは非常に論理的で、書けば書くほど「あ、ここをこう制御したいんだな」という設計者の意図が伝わってくる、温かみのある言語です。

今回ご紹介した`TRANSLATE`関数も、一度コツを掴めば、複雑な文字列加工を一撃で片付けてくれる強力な武器になります。

もしコードを動かしていて「なんだか変な動きをするな?」と思ったら、それはきっと、EBCDICの並び順や、変換リストの長さという「PL/Iからの少しマニアックな挑戦状」です。一つひとつ紐解けば必ず答えは見つかります。

またいつでも相談してくださいね。あなたのメインフレーム・ライフを応援しています!

タイトルとURLをコピーしました