【PL/I学習|初心者向け】メインフレームの魔法:TRANSLATE命令で日付フォーマットを一瞬で変換する方法

1. 導入:なぜTRANSLATEが重要なのか

メインフレーム開発の現場では、日付データの形式変換(例:YYYYMMDDからMMDDYYYYへの変更)に遭遇することが多々あります。初心者の方がやりがちなのは、SUBSTR関数を使って年・月・日を一つずつ切り出し、それらを結合するやり方です。しかし、この方法ではコードが長くなり、可読性が下がります。今回紹介する「TRANSLATE」命令を使えば、複雑な文字列の入れ替えをわずか1行で、しかも非常に高速に処理できるようになります。

2. 基礎知識:TRANSLATE命令とは何か

TRANSLATEは、文字列内の各文字を、指定されたルールに基づいて「別の文字に置き換える」命令です。
基本構文は:TRANSLATE(変換対象, 変換後パターン, 変換前パターン) です。
この命令の面白いところは、文字の「置換」だけでなく、文字の「並べ替え(シャッフル)」にも利用できる点です。第3引数で指定した文字列(変換前)の各位置にある文字が、第2引数で指定した文字列(変換後)の対応する位置の文字に置き換わる、という仕組みを利用します。

3. 実装・解決策

例えば、「20231025」という日付形式を「10252023」に並べ替えたい場合、単純な置換では対応できません。ここでTRANSLATEの出番です。
変換前を「YYYYMMDD」というインデックスとして定義し、変換後を「MMDDYYYY」という配置にすることで、物理的に文字の位置をマッピングします。これにより、SUBSTRによる切り出しと連結という面倒な手順をスキップできます。

4. サンプルプログラム

以下は、PL/I環境で動作するTRANSLATEを利用した日付変換のサンプルコードです。

/ サンプルコード:日付のフォーマット変換 /
DCL DATE_ORIGINAL CHAR(8) INIT(‘20231025’); / 元の日付 /
DCL DATE_FORMATTED CHAR(8); / 変換後の格納用 /

/
第1引数:変換したい文字列
第2引数:変換後の文字の並び(MMDDYYYYの順にしたい)
第3引数:変換元の文字の並び(YYYYMMDDの順であると定義)
/
DATE_FORMATTED = TRANSLATE(DATE_ORIGINAL, ‘MMDDYYYY’, ‘YYYYMMDD’);

/ 実行結果:DATE_FORMATTEDには ‘10252023’ が格納されます /

5. 応用・注意点

このテクニックを使う際の注意点が2つあります。
1つ目は、「変換前パターン」の長さです。第2引数と第3引数は必ず同じ長さである必要があります。長さが異なると期待した動作になりません。
2つ目は、「文字の重複」です。TRANSLATEは指定されたパターンに従って一括変換するため、変換前パターンに同じ文字が含まれている場合(例:’YYYY’など)、意図しない置き換えが起きる可能性があります。あくまで「特定のフォーマットが決まっている固定長データ」の並べ替えに使うのが最も安全で効果的です。

この命令を使いこなせれば、複雑なデータ加工ロジックを非常に簡潔に書くことができます。ぜひ現場のコードで試してみてください。

コメント

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