導入:なぜSUBSTRが重要なのか
メインフレームのレガシーシステムにおいて、外部システムとの連携やバッチ処理を行う際、避けて通れないのが「電文解析」です。固定長フォーマットのデータから特定のフィールドを切り出す際、最も頻繁に使用するのがPL/IのSUBSTR関数です。この関数の挙動を正しく理解していないと、オフセットの計算ミスによるデータ破損や、意図しない値の取得といった重大なバグを招く可能性があります。今回は、現場で安全に使いこなすためのポイントを解説します。
基礎知識:SUBSTR関数の仕組み
PL/IのSUBSTR関数は、文字列の指定した位置から、指定した長さ分だけ文字を抽出する関数です。現代のプログラミング言語(JavaやJavaScriptなど)では「開始位置と終了位置」を指定するものが多いですが、PL/Iは「開始位置と長さ」を指定する点が最大の特徴です。
重要なルールとして、PL/Iのインデックスは「1」から始まります。0から始まる言語に慣れている方は、最初の文字が「1番目」であることを常に意識してください。
実装:安全な切り出し手順
電文解析では、固定長データから特定の項目を抜き出す際に使用します。
構文:SUBSTR(対象文字列, 開始位置, 長さ)
もし、「長さ」を省略した場合は、開始位置から文字列の末尾まで全て抽出されます。これは、可変長のデータ末尾を処理する際に非常に便利です。
サンプルプログラム:電文の項目抽出
以下は、固定長データから「社員番号」と「部署コード」を抽出する実用的なコード例です。
/ 固定長電文を想定したサンプルプログラム /
DECLARE FULL_STR CHAR(20) INITIAL(‘1234567890ABCDE12345’);
DECLARE EMP_NO CHAR(5); / 社員番号用 /
DECLARE DEPT_CD CHAR(3); / 部署コード用 /
/ 1番目から5文字を抽出して社員番号を取得 /
EMP_NO = SUBSTR(FULL_STR, 1, 5);
/ 11番目から3文字を抽出して部署コードを取得 /
DEPT_CD = SUBSTR(FULL_STR, 11, 3);
PUT SKIP LIST(‘社員番号:’ || EMP_NO);
PUT SKIP LIST(‘部署コード:’ || DEPT_CD);
応用・注意点:現場で陥りやすいバグの回避
実務で最も注意すべき点は、「指定した長さが文字列の長さを超えた場合」です。多くのコンパイラや環境ではエラーにならずに末尾まで切り出されることが多いですが、予期せぬ空白文字が含まれる可能性があります。
また、ビット処理にもSUBSTRが使えるケースがありますが、バイナリデータ(BIT型)に対して使用する際は、文字単位ではなくビット単位での指定になるため、思わぬバグを生みやすいです。必ず仕様書で対象変数の型を確認してから実装してください。
もしインデックスの計算が複雑になる場合は、あらかじめ定数やオフセット用の変数を定義し、マジックナンバーをコード内に直接書かないようにするのが、保守性を高める現場の定石です。

コメント