COBOLのシーケンシャルファイルとは?基本構造と処理フローを初心者向けに完全ガイド!
生徒
「先生、COBOLでファイルを使うって聞いたんですけど、どうやって使うんですか?」
先生
「COBOLでは、ファイルを読み書きするのに『シーケンシャルファイル』というものをよく使います。」
生徒
「シーケンシャルファイル?なんだか難しそう…」
先生
「大丈夫ですよ。今回は、初心者の方でも理解できるように、シーケンシャルファイルの基本構造と処理の流れを、わかりやすく説明しますね!」
1. シーケンシャルファイルとは?
COBOLでよく使われる「シーケンシャルファイル」とは、データを1行ずつ、順番に読み書きするファイル形式のことです。
たとえば、ノートに1行ずつ名前や年齢を書いていくイメージです。1ページ目から順番に読み進める必要があります。途中の行だけ読みたい場合でも、最初から順番に読まないといけません。
この形式は、銀行の取引記録や名簿など、大量のデータを順番に処理する場面で使われます。
2. シーケンシャルファイルの基本構造
COBOLでファイルを扱うには、まずプログラム内でファイルの情報を定義する必要があります。シーケンシャルファイルでは以下の3つの定義が重要です:
- SELECT句(セレクト):ファイル名と物理ファイルの関連付けをします
- FD句(ファイル記述句):ファイル内の1レコード(1行)の形を定義します
- OPEN・READ・WRITE・CLOSE文:ファイルを開いて読み書きし、最後に閉じます
これらを使うことで、ファイルの読み書きがスムーズに行えるようになります。
3. シーケンシャルファイルの処理フロー
シーケンシャルファイルを使った基本的な処理の流れは次のようになります:
- SELECT句でファイルを指定する
- FD句でレコードの中身を定義する
- OPEN文でファイルを開く
- READまたはWRITE文でデータを読み書きする
- CLOSE文でファイルを閉じる
この流れをきちんと守ることで、安全にファイルを操作できます。
4. 実際のサンプルプログラム(読み込み編)
ここでは、シーケンシャルファイルを読み込んで、名前と年齢を表示する簡単な例を紹介します。
IDENTIFICATION DIVISION.
PROGRAM-ID. READ-FILE-SAMPLE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT-FILE ASSIGN TO 'USER.DAT'
ORGANIZATION IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD INPUT-FILE.
01 USER-RECORD.
05 USER-NAME PIC A(20).
05 USER-AGE PIC 9(3).
WORKING-STORAGE SECTION.
01 EOF-FLAG PIC X VALUE 'N'.
88 END-OF-FILE VALUE 'Y'.
88 NOT-END-OF-FILE VALUE 'N'.
PROCEDURE DIVISION.
OPEN INPUT INPUT-FILE
PERFORM UNTIL END-OF-FILE
READ INPUT-FILE
AT END
SET END-OF-FILE TO TRUE
NOT AT END
DISPLAY USER-NAME
DISPLAY USER-AGE
END-READ
END-PERFORM
CLOSE INPUT-FILE
STOP RUN.
このプログラムでは、ユーザーデータを1件ずつ順番に読み込み、画面に表示しています。
5. 実際のサンプルプログラム(書き込み編)
次に、シーケンシャルファイルにデータを書き込むサンプルです。
IDENTIFICATION DIVISION.
PROGRAM-ID. WRITE-FILE-SAMPLE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OUTPUT-FILE ASSIGN TO 'USER.OUT'
ORGANIZATION IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD OUTPUT-FILE.
01 USER-RECORD.
05 USER-NAME PIC A(20).
05 USER-AGE PIC 9(3).
WORKING-STORAGE SECTION.
01 USER-NAME-IN PIC A(20) VALUE 'TANAKA TARO'.
01 USER-AGE-IN PIC 9(3) VALUE 025.
PROCEDURE DIVISION.
MOVE USER-NAME-IN TO USER-NAME
MOVE USER-AGE-IN TO USER-AGE
OPEN OUTPUT OUTPUT-FILE
WRITE USER-RECORD
CLOSE OUTPUT-FILE
STOP RUN.
この例では、「TANAKA TARO(25歳)」というデータを新しいファイルに書き出しています。
6. よくある間違いと注意点
- ファイルを
OPENしないでREADやWRITEを使おうとするとエラーになります CLOSEを忘れると、データが正しく保存されなかったり、次にファイルを使えなくなることがあります- ファイル名は実際に存在しているもの、または書き込み可能な場所でないと動作しません
7. シーケンシャルファイルとテキストファイルの違いは?
初心者の方から「テキストファイルとどう違うの?」という質問をよく受けます。実は、COBOLのシーケンシャルファイルもテキストファイルの一種です。ただし、COBOLでは1行=1レコードとして扱い、その構造をしっかり定義して読み書きする点が特徴です。
8. ファイルの組織(ORGANIZATION)とは?
ORGANIZATION IS SEQUENTIALという書き方が出てきましたね。これは「順番に処理するファイルですよ」という意味です。他にもインデックス付きファイルなどがありますが、今回はシーケンシャル(順次)に限定しています。
まとめ
COBOLでファイル処理を行ううえで、シーケンシャルファイルは最も基本的でありながら実用的な手段です。順番通りに1行ずつ読み込んだり書き込んだりするこのファイル形式は、名簿・取引履歴・売上データなど、大量のデータを処理する現場で長年使われ続けています。
今回の記事では、シーケンシャルファイルの定義から処理の流れ、そして実際の読み書きのサンプルプログラムまでを丁寧に確認しました。SELECT句やFD句といった構文でファイルの定義を行い、OPENしてからREADまたはWRITEし、最後にCLOSEで終了するという一連の処理は、COBOLプログラムの基本中の基本です。
また、ファイルからデータを読み込むときには88レベルの条件名を使ってEOF(終端)を判定したり、書き込むときにはWORKING-STORAGEに入力値をあらかじめMOVEしてからWRITEするなど、正確な手順を理解することが安定したプログラム作成につながります。
たとえば、以下のようなサンプルは、複数人のユーザー情報を読み込みながらメッセージを出力する場面を想定しています。
PROCEDURE DIVISION.
OPEN INPUT INPUT-FILE
PERFORM UNTIL END-OF-FILE
READ INPUT-FILE
AT END
SET END-OF-FILE TO TRUE
NOT AT END
DISPLAY "ようこそ、" USER-NAME "さん(年齢:" USER-AGE ")"
END-READ
END-PERFORM
CLOSE INPUT-FILE
STOP RUN.
このように、ファイルに保存された複数行のデータを1つずつ処理していくことができ、プログラムとしての応用力が高まります。また、ASSIGN TOで指定するファイル名は、実行環境に依存するため、パスやファイル存在確認も事前にしておくと良いでしょう。
さらに、シーケンシャルファイルの中身は一般的なテキストファイルに近いため、他の言語やOSとも比較的相性がよく、他システムとのデータ連携にも活かせます。
最後に、ORGANIZATION IS SEQUENTIALという指定によって、ファイルの扱い方が「順番どおり」であることを明示しています。これはCOBOLにおける「ファイルの組織」の一種であり、他には「インデックス付きファイル(INDEXED)」「相対ファイル(RELATIVE)」なども存在しますが、初心者の方はまずこのシーケンシャル形式から慣れていくのがよいでしょう。
実際の業務プログラムでは、入力ファイルを1つ読み込み、加工して出力ファイルに書き出すという流れがとてもよく使われます。その基本となる構文と流れをしっかり身につけておけば、複雑なバッチ処理にも対応できるようになります。
生徒
「先生、シーケンシャルファイルって思ったより簡単だったんですね!ファイルを開いて、読んで、閉じるって流れがしっかりわかりました!」
先生
「うん、その流れを正しく覚えることがとても大切なんだよ。SELECT句やFD句での定義も忘れずにね。」
生徒
「88レベルでEOFをチェックするのも便利でした!あれがあると、読み込みループがすっきり書けますね。」
先生
「その通り。COBOLの構文はルールが多いけれど、きちんと守れば動きはとても安定してるよ。」
生徒
「あと、テキストファイルとの違いもなんとなく分かってきました。1行=1レコードって感覚が大事なんですね。」
先生
「うん、それがわかればファイル操作はもう怖くない。次はインデックス付きファイルにもチャレンジしてみようか。」