導入
読み込みができたので、次は書き込みです。処理した結果を新しいファイルに保存するには、OPEN OUTPUT と WRITE を使います。
説明
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-NAMEとSALES-AMOUNT)に今入っている値を、1レコードとしてファイルへ書き出す。- 読み込み時の
READはファイル名を指定しましたが、書き込み時のWRITEはFDの下のレコード名(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 に切り替えて自分で書いたファイルを読み戻すと、正しく保存されていることを確認できます。