本文へスキップ
BecomeCoder

COBOLコース · 第7章 ファイル処理の基本 ― 順編成ファイル · レッスン38

順編成ファイルへの書き込み ― OPEN OUTPUT / WRITE

ローカル実施

導入

読み込みができたので、次は書き込みです。処理した結果を新しいファイルに保存するには、OPEN OUTPUTWRITE を使います。

説明

       IDENTIFICATION DIVISION.
       PROGRAM-ID. WRITE-SALES.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT SALES-FILE ASSIGN TO "sales_out.dat"
               ORGANIZATION IS LINE SEQUENTIAL.

       DATA DIVISION.
       FILE SECTION.
       FD  SALES-FILE.
       01  SALES-RECORD.
           05  SALES-NAME       PIC X(10).
           05  SALES-AMOUNT     PIC 9(6)V99.

       PROCEDURE DIVISION.
           OPEN OUTPUT SALES-FILE.

           MOVE "TANAKA" TO SALES-NAME.
           MOVE 12345.00 TO SALES-AMOUNT.
           WRITE SALES-RECORD.

           MOVE "SUZUKI" TO SALES-NAME.
           MOVE 67890.50 TO SALES-AMOUNT.
           WRITE SALES-RECORD.

           CLOSE SALES-FILE.
           STOP RUN.
  • OPEN OUTPUT SALES-FILE. … ファイルを書き込み専用で新規に開く。既存の同名ファイルがあれば上書きされる点に注意してください(末尾に追記したい場合は OPEN EXTEND を使います)。
  • WRITE SALES-RECORD.SALES-RECORD(=SALES-NAMESALES-AMOUNT)に今入っている値を、1レコードとしてファイルへ書き出す。
  • 読み込み時の READ はファイル名を指定しましたが、書き込み時の WRITEFDの下のレコード名SALES-RECORD)を指定する点が違います。間違えやすいので気をつけましょう。

実務では、レッスン37の読み込みとこのレッスンの書き込みを組み合わせ、「あるファイルを読み込んで、条件に応じて加工し、別のファイルに書き出す」という処理がよく書かれます。

      *> 読み込みつつ、条件を満たしたレコードだけ書き出すイメージ
           OPEN INPUT SALES-FILE.
           OPEN OUTPUT HIGH-SALES-FILE.

           PERFORM UNTIL WS-EOF-FLAG = "Y"
               READ SALES-FILE
                   AT END
                       MOVE "Y" TO WS-EOF-FLAG
                   NOT AT END
                       IF SALES-AMOUNT > 50000
                           WRITE HIGH-SALES-RECORD FROM SALES-RECORD
                       END-IF
               END-READ
           END-PERFORM.

           CLOSE SALES-FILE HIGH-SALES-FILE.

WRITE ... FROM ... は、書き込み前に指定した項目の内容を自動的にレコード領域へMOVEしてから書き出す、便利な書き方です。

試すには

「氏名」と「金額」を3人分、WRITEで新しいファイルへ書き出すプログラムを書いてみましょう。実行後、OPEN INPUT に切り替えて自分で書いたファイルを読み戻すと、正しく保存されていることを確認できます。