こんにちは。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からの少しマニアックな挑戦状」です。一つひとつ紐解けば必ず答えは見つかります。
またいつでも相談してくださいね。あなたのメインフレーム・ライフを応援しています!
