COBOLのファイル処理総合サンプル|初心者向け 入出力・ループ・エラー・パフォーマンス対策
生徒
「COBOLでファイルを読み込んで加工して、新しいファイルに書き出す処理を一通りやってみたいです!」
先生
「それは良い練習ですね。読み込み(READ)、終端検出(EOF)、エラー対応、書き込み(WRITE)、ループ、最後に閉じる(CLOSE)まで一連の流れを実装してみましょう。」
生徒
「パソコン初心者でもわかるように、ゆっくりお願いします!」
1. サンプルプログラムの概要
このサンプルでは、次のようなファイル処理を行います:
- input.dat を読み込み
- 顧客IDが1000以上だったら output.dat に書き出す
- EOF(ファイルの終わり)を検出してループ終了
- ファイルステータスでエラーをチェック
- 最後にファイルを閉じる
初心者向けキーワード:ファイル処理、EOF検出、エラー処理、コボル 入出力、ループ制御。
2. 完全なサンプルコード
IDENTIFICATION DIVISION.
PROGRAM-ID. FILE-TEST.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO "input.dat"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS WS-FS-IN.
SELECT OUT-FILE ASSIGN TO "output.dat"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS WS-FS-OUT.
DATA DIVISION.
FILE SECTION.
FD IN-FILE
RECORD CONTAINS 80 CHARACTERS.
01 IN-REC PIC X(80).
FD OUT-FILE
RECORD CONTAINS 80 CHARACTERS.
01 OUT-REC PIC X(80).
WORKING-STORAGE SECTION.
01 WS-FS-IN PIC XX.
01 WS-FS-OUT PIC XX.
01 EOF-FLAG PIC X VALUE 'N'.
01 CUSTOMER-ID PIC 9(4).
01 WS-DATA PIC X(80).
PROCEDURE DIVISION.
MAIN-LOGIC.
OPEN INPUT IN-FILE
OUTPUT OUT-FILE
IF WS-FS-IN NOT = "00" OR WS-FS-OUT NOT = "00"
DISPLAY "ファイルオープン失敗 FS-IN:" WS-FS-IN " FS-OUT:" WS-FS-OUT
STOP RUN
END-IF
PERFORM UNTIL EOF-FLAG = 'Y'
READ IN-FILE INTO WS-DATA
AT END MOVE 'Y' TO EOF-FLAG
INVALID KEY
DISPLAY "読み込みエラー FS-IN:" WS-FS-IN
MOVE 'Y' TO EOF-FLAG
END-READ
IF EOF-FLAG = 'N'
MOVE WS-DATA(1:4) TO CUSTOMER-ID
IF CUSTOMER-ID >= 1000
MOVE WS-DATA TO OUT-REC
WRITE OUT-REC
IF WS-FS-OUT NOT = "00"
DISPLAY "書き込み失敗 FS-OUT:" WS-FS-OUT
END-IF
END-IF
END-IF
END-PERFORM
CLOSE IN-FILE OUT-FILE
DISPLAY "処理終了"
STOP RUN.
END PROGRAM FILE-TEST.
3. 各部分の解説
- SELECT ~ FILE STATUS:ファイルを開いた後に、エラー番号(FILE STATUSコード)を確認できます。
- OPEN INPUT/OUTPUT:ファイルの読み込み/書き込みの開始。
- PERFORM UNTIL EOF-FLAG:EOFまで何度も繰り返すループ。
- READ … AT END:ファイル終端に達したときにEOFを設定。
- INVALID KEY:読み込みで問題があるときに停止します。
- IF CUSTOMER-ID >= 1000:条件分岐して、必要なデータだけ書き出します。
- WRITE OUT-REC:出力ファイルへの書き込み。
- CLOSE:最後にファイルをきちんと閉じる。
4. 実行結果イメージ
(処理中の画面表示例)
処理終了
また、output.datには、条件を満たす行だけが書き出されます。
5. 初心者向けポイント&豆知識
- FILE STATUSでオープン、読み書きのエラーが起きたかすぐわかる
- EOF検出を入れることで、最後まで読み取れる
- 条件分岐で必要なデータだけ処理できる
- 一度OPENして、最後にCLOSEをすればパフォーマンスもよくなる
- INVALID KEYで読み込みの不正を検出できる
初心者の方でも、ファイル処理の流れがこの一例で理解できるようになっています。
まとめ
COBOLでのファイル処理は、実際の業務システムにおいて欠かせない基礎であり、読み込み、条件分岐、エラー検出、繰り返し、書き込み、終了処理といった複数の要素が丁寧につながって動いています。今回の記事では、入力ファイルを順番に読み取りながら必要な行だけを出力ファイルへ転送する一連の処理を通して、ファイルオープンからクローズまでの流れを自然に理解できるように整理してきました。特に、EOF判定を行いながらループを制御する考え方は、ファイル処理の中心となる動きであり、データをひとつずつ確実に扱うための重要な手段になります。さらに、FILE STATUSを確認しながらエラーを検出する方法も、業務システムでは必須の考え方です。思わぬ入力不備やファイル破損に遭遇しても、安全に停止させたり、続行可能な状態を判断できるようになります。 そして、今回のサンプルで利用したPERFORM UNTILのループは、ファイル終端を検出するまで繰り返し処理を続けるという構造を自然に体験できるため、初心者の方が最初につまずきがちな「繰り返し処理」「条件付き処理」「終端処理」の3つを一度に学べる利点があります。顧客IDが一定の値以上であれば出力するという条件分岐も、実際の業務データに近い形で理解できるため、実践的な感覚を身につける支えになります。値を条件として抽出したり加工したりする処理は、日々の業務において非常によく使われる型ですので、今回の例を土台にして、自分なりに条件を増やしたり、複数の項目を組み合わせたりする練習にも発展させやすいでしょう。 また、ファイルを開く際と閉じる際にはパフォーマンス上の注意点も含まれていました。一度だけOPENし、必要な処理が終わったタイミングでCLOSEすることで、無駄なリソース消費を避け、安定した動作を維持できます。大規模なデータを扱う処理では特に重要で、データ量が増えるほど、こうした細かな配慮が全体の処理時間に大きく影響します。OPENとCLOSEは単なる準備と後片付けのように見えますが、プログラム全体の品質に強く関わる大事な部分です。 今回扱った内容を振り返ると、COBOLのファイル処理は単純な読み書きだけでなく、複数の項目がつながって初めて安全で信頼性の高い処理になります。読み取り、分岐、加工、出力、それらを支えるループ制御とエラー検出という流れをひとつずつ確認しながら動作を理解することで、実務で求められる品質や構造に自然と近づいていきます。ここでは、今回学んだ内容を踏まえて、さらに理解を深めるための応用サンプルを用意しました。実際の職場で遭遇するような追加処理を含めているため、より複雑なファイル処理のイメージをつかむ練習になるはずです。
応用サンプル:入力データを加工してログ出力も行う例
条件を満たすデータを書き出すだけでなく、処理内容をログとして記録する例です。ファイル処理を複数組み合わせる場面は、実務で特に多くなります。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-ADV.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO "input.dat"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS FS-IN.
SELECT OUT-FILE ASSIGN TO "output.dat"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS FS-OUT.
SELECT LOG-FILE ASSIGN TO "log.txt"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS FS-LOG.
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-DATA PIC X(80).
FD OUT-FILE.
01 OUT-DATA PIC X(80).
FD LOG-FILE.
01 LOG-REC PIC X(120).
WORKING-STORAGE SECTION.
01 FS-IN PIC XX.
01 FS-OUT PIC XX.
01 FS-LOG PIC XX.
01 END-FLAG PIC X VALUE "N".
01 CID PIC 9(4).
PROCEDURE DIVISION.
MAIN-PROC.
OPEN INPUT IN-FILE
OUTPUT OUT-FILE
OUTPUT LOG-FILE
PERFORM UNTIL END-FLAG = "Y"
READ IN-FILE INTO IN-DATA
AT END MOVE "Y" TO END-FLAG
END-READ
IF END-FLAG = "N"
MOVE IN-DATA(1:4) TO CID
IF CID >= 1000
MOVE IN-DATA TO OUT-DATA
WRITE OUT-DATA
STRING "出力処理 ID=" CID INTO LOG-REC
WRITE LOG-REC
END-IF
END-IF
END-PERFORM
CLOSE IN-FILE OUT-FILE LOG-FILE
STOP RUN.
この応用サンプルでは、元データを加工しながら別ファイルへ書き出し、さらに処理内容をログとして残しています。複数のファイルを扱いながら条件分岐と繰り返し処理を組み合わせて動かすことで、より実践的なファイル処理の姿を学べます。また、ログを残すことで後から処理内容を追跡できるため、実務の保守性にもつながります。こうした補助的な処理は、開発現場でも非常によく使われるため、早い段階で慣れておくと大きな力になります。
生徒
「ひとつのサンプルで読み込み、条件判定、書き込み、ログ出力まで全部動くと、流れがすごく分かりやすいです。」
先生
「そうですね。COBOLのファイル処理は流れを意識すれば自然と理解できるようになりますよ。」
生徒
「EOFを使ったループ処理も、実際に動作を追ってみると難しくないと感じました。」
先生
「繰り返しの仕組みが分かると、業務データの処理にもすぐ応用できますからね。」
生徒
「今回の応用サンプルみたいにログも残せると、実際のシステムに近い感じで勉強になります!」
先生
「その調子です。ファイル処理はひとつ覚えるだけで一気に世界が広がりますよ。」