PL/IのSTREAM I/O入門:GET/PUT EDITでデータを自在に操ろう!〜Java/COBOL経験者も安心〜
メインフレームの世界へようこそ!JavaやCOBOLといった馴染みのある言語の経験をお持ちの皆さん、PL/Iと聞くと、なんだか敷居が高そう…とか、独特なルールがあって難しそう…って思っていませんか?大丈夫です、そんなことはありません!PL/Iの基本を一つずつ紐解いていけば、きっとそのパワフルさと柔軟性に魅了されるはずです。
特に、基幹システムで避けて通れない「データの入出力」、中でもSTREAM I/Oにおける`GET`と`PUT`の`EDIT`指定は、データの整形や読み込みを柔軟に行うための強力な武器になります。今回は、この`EDIT`指定の役割と、ピクチャ編集文字を使ったデータ整形、そして改行制御の仕組みを、皆さんの経験に寄り添いながら、優しく、そして丁寧に解説していきますね。
PL/Iプログラムの基本構造:まずはここから!
PL/Iプログラムは、基本的に`PACKAGE`や`PROCEDURE`といったブロックで構成されます。中でも、プログラムのエントリーポイントとなるのは`PROCEDURE`に`OPTIONS(MAIN)`が付いたものです。これは、他の言語でいうところの`main`メソッドや`START`文に相当するものだとイメージしてください。
1
MYPROG: PROCEDURE OPTIONS(MAIN);
/ ここにメインの処理を記述します /
DECLARE / 変数宣言 / ;
/ … 処理 … /
RETURN; / プログラムの終了 /
END MYPROG;
`DECLARE`文で変数を宣言し、その後に処理を記述していく、という流れは他の言語でもよく見かける形ですよね。PL/Iのデータ型や宣言の仕方も、慣れてしまえばきっとスムーズに理解できるはずです。
STREAM I/Oの「EDIT」指定って何?
さて、本題のSTREAM I/Oです。PL/Iでは、データをファイルから読み込んだり、ファイルに書き出したりする際に、いくつかのモードを選択できます。その中でも、レコードの区切りを意識せずに、データの流れ(ストリーム)として扱いたい場合に便利なのがSTREAMモードです。
そして、このSTREAMモードで、読み込むデータや書き出すデータの「形」を細かく指定したい、というときに活躍するのが`GET`や`PUT`の`EDIT`指定なんです。
例えば、CSVファイルのような、カンマで区切られたデータを読み込みたい場合や、特定の桁数で数値を揃えて出力したい場合などに、この`EDIT`指定が威力を発揮します。
ピクチャ編集文字でデータを自在に整形!
`EDIT`指定の肝となるのが、「ピクチャ編集文字」と呼ばれる特殊な記号群です。これらを使うことで、データの型や表示形式を細かく制御できるのです。
1. 数値データの整形
まずは、数値データの整形から見ていきましょう。
- `9`: 数字を表します。例えば、`PIC ‘999’`と指定すると、3桁の数値を表すことになります。
- `V`: 小数点位置を表します。物理的な桁数ではなく、論理的な小数点位置を指定します。例えば、`PIC ’99V99’`は、小数点以下2桁を含む4桁の数値を表します。
- `Z`: ゼロ抑制を表します。数字の前にゼロがある場合、そのゼロを表示しません。例えば、`PIC ‘ZZZ9’`で`0015`という値が入っていると、出力は`15`となります。
- `$`: 通貨記号(ドルマーク)を先頭に挿入します。`PIC ‘$999’`とすると、`123`は`$123`と表示されます。
- `,`: 千単位の区切り文字(カンマ)を挿入します。`PIC ‘9,999’`とすると、`12345`は`12,345`と表示されます。
- `S`: 数値の符号(プラスまたはマイナス)を表します。`PIC ‘S999’`とすると、`+123`や`-45`のように表示されます。
コード例:数値データの出力
では、これらのピクチャ編集文字を使って、数値を整形して出力する例を見てみましょう。
1
OUTPUT_DEMO: PROCEDURE OPTIONS(MAIN);
DECLARE NUM1 FIXED DECIMAL(5,2) INIT(123.45); / 5桁、小数点以下2桁の固定小数点数 /
DECLARE NUM2 FIXED DECIMAL(3) INIT(7); / 3桁の固定小数点数 /
DECLARE NUM3 FIXED DECIMAL(5) INIT(12345); / 5桁の固定小数点数 /
DECLARE NUM4 FIXED DECIMAL(5) INIT(-8); / 5桁の固定小数点数 (符号あり) /
PUT SKIP LIST(‘— 数値データ整形例 —‘);
/ 桁数を揃えて出力 /
PUT SKIP EDIT(‘NUM1 (PIC \’999V99\’):’) (A) (NUM1) (PIC ‘999V99’);
/ ゼロ抑制と桁揃え /
PUT SKIP EDIT(‘NUM2 (PIC \’ZZZ9\’):’) (A) (NUM2) (PIC ‘ZZZ9’);
/ 千単位の区切り文字 /
PUT SKIP EDIT(‘NUM3 (PIC \’9,999\’):’) (A) (NUM3) (PIC ‘9,999’);
/ 符号表示 /
PUT SKIP EDIT(‘NUM4 (PIC \’S999\’):’) (A) (NUM4) (PIC ‘S999’);
RETURN;
END OUTPUT_DEMO;
このコードを実行すると、以下のような出力が得られます。(環境によって多少の違いがある場合もあります)
— 数値データ整形例 —
NUM1 (PIC ‘999V99’): 123.45
NUM2 (PIC ‘ZZZ9’): 007
NUM3 (PIC ‘9,999’): 12,345
NUM4 (PIC ‘S999’): -008
どうでしょう?`EDIT`指定とピクチャ編集文字を使うことで、数値を意図した通りに綺麗に整形できているのがわかりますよね。
2. 文字列データの整形
文字列データも、ピクチャ編集文字を使って整形できます。
- `X`: 16進文字を表します。
- `A`: 文字列を表します。`PIC ‘AAAA’`とすると、4文字の文字列を表します。
コード例:文字列データの入力
`GET EDIT`を使うと、特定のフォーマットでファイルからデータを読み込むことができます。例えば、固定長のテキストファイルから、名前と年齢を読み込む場合などを考えてみましょう。
1
INPUT_DEMO: PROCEDURE OPTIONS(MAIN);
DECLARE NAME CHARACTER(10); / 名前を格納する10文字の領域 /
DECLARE AGE FIXED DECIMAL(3); / 年齢を格納する3桁の数値 /
PUT SKIP LIST(‘— 文字列・数値データ入力例 —‘);
PUT SKIP LIST(‘名前(10文字)と年齢(3桁)を入力してください。’);
/ ファイルからREAD EDITで指定したフォーマットで読み込む /
/ ここでは、簡易的に標準入力から読み込みます /
GET EDIT(NAME, AGE) (A(10), F(3));
PUT SKIP LIST(‘— 入力されたデータ —‘);
PUT SKIP EDIT(‘名前:’) (A) (NAME) (A); / 文字列はそのまま出力 /
PUT SKIP EDIT(‘年齢:’) (A) (AGE) (PIC ‘ZZZ’); / 数値はピクチャ指定して出力 /
RETURN;
END INPUT_DEMO;
この例では、`GET EDIT(NAME, AGE) (A(10), F(3));`という部分がポイントです。
- `A(10)`: 10文字の文字列として読み込みます。
- `F(3)`: 3桁の数値(固定小数点数)として読み込みます。
このように、`GET EDIT`とピクチャ指定を組み合わせることで、データソースのフォーマットに合わせて正確にデータを読み込むことができるのです。
改行制御の仕組み
PL/Iの`PUT`文では、`SKIP`オプションを使って改行を制御できます。
- `PUT SKIP;`: 空行を1行挿入します。
- `PUT SKIP(n);`: 空行を`n`行挿入します。
- `PUT SKIP LIST(…)`: リスト形式で出力する際に、各項目の間や行末で自動的に改行されます。
- `PUT SKIP EDIT(…)`: `EDIT`指定の場合、`PUT`文の実行ごとに改行されます。
コード例:改行制御
1
NEWLINE_DEMO: PROCEDURE OPTIONS(MAIN);
PUT SKIP LIST(‘これは最初の行です。’);
PUT SKIP(2) LIST(‘これは3行目に表示されます(間に1行空き)。’);
PUT SKIP EDIT(‘— EDIT指定での出力 —‘) (A);
PUT SKIP EDIT(‘最初の行’) (A);
PUT SKIP EDIT(‘次の行’) (A);
RETURN;
END NEWLINE_DEMO;
このコードを実行すると、行間が調整された出力が得られます。STREAM I/Oでは、この`SKIP`オプションをうまく使うことで、出力結果のレイアウトを整えることができるんです。
まとめ:PL/IのSTREAM I/Oは怖くない!
いかがでしたでしょうか?PL/Iの`GET/PUT EDIT`とピクチャ編集文字、そして改行制御について、基本的な部分を解説しました。最初は少し戸惑うかもしれませんが、実際にコードを書いて動かしてみると、その便利さが実感できるはずです。
JavaやCOBOLでの経験があれば、きっとPL/Iの概念もスッと理解できる部分が多いはずです。PL/Iの強力なデータ操作能力を味方につけて、メインフレームの世界での開発をぜひ楽しんでくださいね!
もし、さらに詳しく知りたい点や、具体的な改修で困っていることなどがあれば、いつでもお気軽にご質問ください。皆さんのPL/Iライフを、精一杯サポートさせていただきます!
