【入門編】STREAM I/OにおけるGET/PUT EDITとフォーマット制御 – PL/Iの基本構文とデータ制御実践ガイド

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ライフを、精一杯サポートさせていただきます!

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