COBOLのプログラムでは、ファイルからデータを読み込む処理が欠かせませんよね。その中心となるのが、今回解説する「READ文」です。
この記事では、COBOLのREAD文について、基本のキから、実際の使い方、そして「ここだけは押さえて!」という注意点まで、まるっと解説していきます。
この記事を読むと、こんなことができるようになります。
- READ文が何をする命令なのか、しっかり理解できる
- READ文の基本的な書き方を覚えられる
- 簡単なファイル読み込みプログラムを作れるようになる
- READ文を使う上での注意点がわかり、エラーを減らせる
さあ、一緒にCOBOLのファイル読み込みをマスターしましょう!
COBOLの「READ文」とは?ファイル入力の基本を理解する
まず、COBOLのREAD文が何者なのか、その役割から見ていきましょう。
ズバリ、READ文は「ファイルからデータを1件(1レコード)ずつプログラムの中に読み込んでくる」ための命令です。
例えば、顧客リストのファイルから、一人分の顧客情報をプログラムに取り込む、といった処理で使われます。
COBOLは大量のデータを一括で処理する「バッチ処理」が得意な言語です。そのため、ファイルからデータを次々に読み込んで処理を行うREAD文は、COBOLプログラミングの基本中の基本であり、避けては通れない道なのです。
まるで、本を1ページずつめくって内容を読んでいくようなイメージですね!
「READ」文の基本的な書き方
それでは、READ文をどうやって書くのか、基本的な形)を見ていきましょう。
まずは一番シンプルな形から覚えるのが近道です。
順ファイル(テキストファイルのように、データが順番に並んでいるファイル)からデータを読み込む場合の基本的な書き方は、以下のようになります。
READ ファイル名 RECORD [ INTO データ項目 ] [ AT END 命令文1 ... ] [ NOT AT END 命令文2 ... ] END-READ.
各部分を簡単に説明しますね。
- READ ファイル名 RECORD
どのファイル(ファイル名はプログラム内で定義します)から1レコード読み込むかを指定します。これは必須です。 - INTO データ項目 (オプション)
読み込んだデータを、プログラム内の特定の場所(データ項目)に直接格納したい場合に指定します。 - AT END 命令文1 ... (オプション)
ファイルを最後まで読み込んでしまい、もう読み込むデータがない場合(End Of File、EOFとも言います)に実行したい処理を書きます。これも非常に良く使います。 - NOT AT END 命令文2 ... (オプション)
まだ読み込むデータがあって、正常に読み込めた場合に実行したい処理を書きます。 - END-READ
READ文の範囲を明確にするための区切りです。(比較的新しいCOBOL規格で推奨されていますが、古いコードでは無い場合もあります)
最初はオプションが多くて戸惑うかもしれませんが、まずはシンプルな形から見ていきましょう。
最もシンプルなREAD文の構文
一番シンプルなREAD文の書き方は、以下のようになります。
READ ファイル名 RECORD.
この書き方の場合、読み込まれたデータは、DATA DIVISIONのFILE SECTIONにあるFD句(ファイル定義)で定義したレコード領域に格納されます。
事前にファイルを定義しておく必要がある点に注意してくださいね。
INTO句を使ったREAD文の書き方
次に、INTO句を使った書き方を見てみましょう。
READ ファイル名 RECORD INTO 作業場所のデータ項目.
この書き方をすると、読み込んだデータが、FD句のレコード領域ではなく、作業場所(WORKING-STORAGE SECTIONなど)で定義した項目に直接読み込めるので便利です。
読み込んだデータをすぐにプログラムで加工したり、計算に使ったりしたい場合に、このINTO句付きのREAD文がよく使われますよ。
「READ文」の使い方
理屈だけだとピンとこないかもしれませんね。
ここからは、実際にREAD文を使った簡単なサンプルプログラムを見て、動きを掴んでいきましょう!
コードを見るのが一番分かりやすいですからね!
ここでは、簡単な社員情報(社員番号と氏名)が書かれたテキストファイルを読み込んで、その内容を画面に表示するプログラムを作成してみます。
順次ファイル(Sequential File)の読み込みサンプル
まず、入力となるテキストファイル「INPUT.TXT」を用意します。中身はこんな感じです。
001ヤマダ タロウ 002サトウ ハナコ 003タナカ ジロウ
次に、このファイルを読み込むCOBOLプログラムです。
IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE-READ. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPUT-FILE ASSIGN TO "INPUT.TXT" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-FS. DATA DIVISION. FILE SECTION. FD INPUT-FILE. 01 INPUT-REC PIC X(15). WORKING-STORAGE SECTION. 01 WS-FS PIC XX. 88 FS-SUCCESS VALUE "00". 88 FS-EOF VALUE "10". 01 WS-EOF-FLAG PIC X VALUE '0'. 88 IS-EOF VALUE '1'. 01 WS-SYAIN-RECORD. 05 WS-SYAIN-NO PIC X(3). 05 FILLER PIC X(1). 05 WS-SYAIN-NAME PIC X(11). PROCEDURE DIVISION. MAIN-PROC. OPEN INPUT INPUT-FILE. IF NOT FS-SUCCESS DISPLAY "ファイルオープンエラー: " WS-FS STOP RUN END-IF. PERFORM READ-PROCESS UNTIL IS-EOF. CLOSE INPUT-FILE. STOP RUN. READ-PROCESS. READ INPUT-FILE RECORD INTO WS-SYAIN-RECORD AT END SET IS-EOF TO TRUE NOT AT END DISPLAY "社員番号: " WS-SYAIN-NO DISPLAY "社員氏名: " WS-SYAIN-NAME DISPLAY "--------------------" END-READ. IF NOT FS-SUCCESS AND NOT IS-EOF DISPLAY "ファイルリードエラー: " WS-FS SET IS-EOF TO TRUE END-IF.
サンプルプログラムの解説
ちょっと長いですが、順を追って見ていきましょう。
- ENVIRONMENT DIVISION
ここでは`SELECT INPUT-FILE ASSIGN TO "INPUT.TXT"` で、プログラム内で使うファイル名(INPUT-FILE)と実際のファイル名("INPUT.TXT")を結びつけています。`ORGANIZATION IS LINE SEQUENTIAL`で、これがテキストファイル(順ファイル)であることを示します。`FILE STATUS IS WS-FS`は、ファイル操作の結果(成功、失敗、EOFなど)を受け取る変数を指定しています。 - DATA DIVISION
FILE SECTIONの`FD INPUT-FILE.`以下で、読み込むファイルのレコード形式を定義しています(ここでは`INPUT-REC PIC X(15)`)。
WORKING-STORAGE SECTIONでは、ファイルステータス(WS-FS)や、ファイル終了フラグ(WS-EOF-FLAG)、そして読み込んだデータを格納する作業領域(WS-SYAIN-RECORD)を定義しています。 - PROCEDURE DIVISION
ここが実際の処理の流れです。- `OPEN INPUT INPUT-FILE.` ファイルを読み込みモードで開きます。
- `PERFORM READ-PROCESS UNTIL IS-EOF.` EOFフラグ(WS-EOF-FLAG)が立つまで`READ-PROCESS`という処理を繰り返します。この繰り返し処理がCOBOLのファイル処理の基本パターンです。
- `READ INPUT-FILE RECORD INTO WS-SYAIN-RECORD` ここが今回の主役、READ文です!INPUT-FILEから1レコード読み込み、WS-SYAIN-RECORDに格納します。
- `AT END SET IS-EOF TO TRUE` もしファイルの終わりに達していたら、EOFフラグを立てます。これでPERFORM UNTILループが終了します。
- `NOT AT END DISPLAY ...` まだデータが読み込めたら、社員番号と氏名を表示します。
- `CLOSE INPUT-FILE.` 処理が終わったらファイルを閉じます。
- `STOP RUN.` プログラムを終了します。
大まかな流れはつかめましたか? OPENして、READを繰り返して、CLOSEする、この流れが基本です。
実行結果の確認
上記のプログラムと入力ファイル「INPUT.TXT」を使って実行すると、以下のような結果が画面に表示されるはずです。
社員番号: 001 社員氏名: ヤマダ タロウ -------------------- 社員番号: 002 社員氏名: サトウ ハナコ -------------------- 社員番号: 003 社員氏名: タナカ ジロウ --------------------
入力ファイルの内容が1件ずつ読み込まれ、表示されているのが分かりますね。
このようにREAD文を使って、ファイルからデータを取り出すことができます。
COBOLの「READ文」で注意すべき点
READ文は便利ですが、使う上でいくつか注意しておきたいポイントがあります。
これを押さえておけば、余計なエラーに悩まされる時間も減るはずですよ!
ファイルの事前OPENと事後CLOSEを忘れずに
これは絶対です!
READ文でファイルを読み込む前には、必ず`OPEN INPUT`命令(読み込み専用の場合)または`OPEN I-O`命令(読み書き両用の場合)でファイルを「開く」必要があります。
そして、ファイルの読み込みが終わったら、必ず`CLOSE`命令でファイルを「閉じる」のを忘れないでください。
READの前にはOPEN INPUT、終わったらCLOSE、これはセットで覚えてくださいね。
これを忘れると、ファイルが読み込めなかったり、他のプログラムからファイルが使えなくなったりする原因になります。
ファイル終了(EOF)のハンドリング:AT END句
ファイルからデータを読み込んでいると、いつかは必ずファイルの終わりに到達します。
ファイルの終わり(EOF: End Of File)に達した後に、さらにREAD文を実行しようとするとエラーになってしまいます。
そこで使うのが、READ文の`AT END`句です。
READ ファイル名 RECORD AT END * ファイルが終わった時の処理を書く DISPLAY "ファイルの終わりに到達しました。" MOVE '1' TO WS-EOF-FLAG *> EOFフラグを立てるなど NOT AT END * まだデータが読み込めた時の処理を書く DISPLAY "データを読み込みました。" END-READ.
AT END句を使ってファイルの終わりを検知するのが定石です。サンプルプログラムのように、ファイルが終わったらフラグを立てて、繰り返し処理(PERFORM)を抜ける、という流れが一般的によく使われます。
これがないと、プログラムが止まらなくなったり、意図しないエラーになったりするので、必ずファイル終了の処理は入れましょう。
(補足:ファイルステータス(FILE STATUS)をチェックすることで、EOFだけでなく、もっと細かいエラー内容を知ることもできますが、まずはAT END句をしっかり使いこなせるようになりましょう!)
【まとめ】「READ文」の基本をしっかり押さえよう
今回は、COBOLのファイル入力の要である「READ文」について解説しました。
最後に、ポイントを振り返ってみましょう。
- READ文はファイルから1レコードずつデータを読み込む命令
- 基本構文は `READ ファイル名 RECORD.`
- `INTO`句を使うと、指定した作業領域に直接データを読み込める
- 使う前には必ず`OPEN`、使い終わったら必ず`CLOSE`する
- ファイルの終わりは`AT END`句で検知して、適切に処理する
- サンプルプログラムで実際の動きを確認するのが理解への近道
さあ、これでREAD文の基本はバッチリなはず!
最初は難しく感じるかもしれませんが、実際に手を動かしてプログラムを書いてみるのが一番です。
ぜひ、この記事を参考に、簡単なファイル読み込みに挑戦してみてくださいね。
応援しています!
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。