【COBOL学習|初心者向け】COBOLでファイル入出力の基本!FILE SECTIONをマスターしよう!

皆さん、COBOLの世界へようこそ!今回は、COBOLプログラムで外部ファイルとやり取りする際の「FILE SECTION(ファイル節)」について、初心者の方にも分かりやすく解説していきます。ファイル入出力は、COBOLプログラムの要とも言える部分。ここをしっかり理解すれば、データの読み書きがスムーズにできるようになりますよ!

1. なぜFILE SECTIONが重要なのか?

COBOLプログラムは、データベースや他のシステムと連携して、大量のデータを処理することがよくあります。その際、外部のファイルにデータを書き込んだり、ファイルからデータを読み込んだりする必要があります。FILE SECTIONは、まさにこの「外部ファイル」とプログラムの間で、データのやり取りをスムーズにするための「設計図」のような役割を果たします。

この設計図がしっかりしていないと、

  • プログラムがファイルを正しく開けず、エラーになる
  • 読み込んだデータが文字化けしたり、壊れたりする
  • 意図しないデータがファイルに書き込まれてしまう

といった問題が発生しやすくなります。FILE SECTIONを正しく定義することで、これらのトラブルを防ぎ、安全で確実なファイル入出力処理を実現できるのです。

2. FILE SECTIONの基礎知識

FILE SECTIONは、COBOLプログラムの「DATA DIVISION」の中に記述されます。DATA DIVISIONは、プログラムで使うデータを定義する場所で、FILE SECTIONはその中でも特に「外部ファイル」に関する情報を記述するセクションです。

FILE SECTIONで主に定義するのは、以下の2つの要素です。

  • FD (File Description – ファイル記述)

これは、プログラムが使用する「ファイルそのもの」に関する情報を定義します。例えば、ファイルの名前、ファイルがどのように編成されているか(順編成、インデックス編成など)、ブロックサイズ(ファイルを読み書きする際のまとまりの大きさ)、レコード長(ファイル内の1レコードの長さ)などを指定します。

  • SD (Sort Description – ソート記述)

これは、COBOLのソート機能を使う場合に、一時的に使用する作業ファイルに関する情報を定義します。

そして、FD(またはSD)の後に、そのファイルに格納される「レコード」の構造を定義します。レコードとは、ファイル内の1行(または1つのまとまり)のことです。このレコード構造を定義する際に、COBOLの「レベル番号」と「ピクチャ句(PIC)」が活躍します。

  • レベル番号

データの階層構造を示すための番号です。通常、最上位は「01」、その下位は「05」「10」…のように、5の倍数で増やしていきます。

  • ピクチャ句 (PIC)

データの種類(数字、英数字など)や長さを指定します。例えば、「PIC X(10)」なら10文字の英数字、「PIC 9(5)」なら5桁の数字を表します。

3. FILE SECTIONの実装例:簡単なファイル出力

では、実際にFILE SECTIONを使って、簡単なファイル出力処理を記述してみましょう。

まず、DATA DIVISIONのFILE SECTIONに、出力したいファイルとレコードの構造を定義します。

DATA DIVISION.
FILE SECTION.
FD OUTPUT-FILE > 出力するファイル名を定義
RECORD CONTAINS 80 CHARACTERS > レコード長を80文字に指定
DATA RECORDS ARE OUTPUT-RECORD. > このFDで扱うレコード名
01 OUTPUT-RECORD. > レコード構造の定義開始
05 OUTPUT-ID PIC X(10). > 10文字のID項目
05 OUTPUT-NAME PIC X(30). > 30文字の名前項目
05 OUTPUT-ADDRESS PIC X(40). > 40文字のアドレス項目

PROCEDURE DIVISION.
> ここにファイル処理のロジックを記述
> 例:OPEN OUTPUT OUTPUT-FILE.
> MOVE ‘TEST001’ TO OUTPUT-ID.
> MOVE ‘山田太郎’ TO OUTPUT-NAME.
> MOVE ‘東京都〇〇区’ TO OUTPUT-ADDRESS.
> WRITE OUTPUT-RECORD.
> CLOSE OUTPUT-FILE.
STOP RUN.

この例では、`OUTPUT-FILE`という名前のファイルに対して、`OUTPUT-RECORD`という構造のレコードを書き込むことを想定しています。`OUTPUT-RECORD`は、`OUTPUT-ID`(10文字)、`OUTPUT-NAME`(30文字)、`OUTPUT-ADDRESS`(40文字)の3つの項目から構成されています。これらの項目を合計すると10 + 30 + 40 = 80文字となり、`RECORD CONTAINS 80 CHARACTERS`で指定したレコード長と一致していることが分かります。

4. サンプルプログラム

ここでは、上記で定義したFILE SECTIONを使って、実際にファイルにデータを書き込む簡単なサンプルプログラムを紹介します。

IDENTIFICATION DIVISION.
PROGRAM-ID. FILE-OUTPUT-SAMPLE.
AUTHOR. COBOL Master.

DATA DIVISION.
FILE SECTION.
FD OUTPUT-FILE
RECORD CONTAINS 80 CHARACTERS
DATA RECORDS ARE OUTPUT-RECORD.
01 OUTPUT-RECORD.
05 OUTPUT-ID PIC X(10).
05 OUTPUT-NAME PIC X(30).
05 OUTPUT-ADDRESS PIC X(40).

PROCEDURE DIVISION.
MAIN-LOGIC.
> ファイルを書き込みモードで開く
OPEN OUTPUT OUTPUT-FILE.

> 1件目のデータを準備
MOVE ‘EMP0001 ‘ TO OUTPUT-ID. > 右側はスペースで埋める(PIC Xの場合)
MOVE ‘佐藤 花子’ TO OUTPUT-NAME.
MOVE ‘大阪府中央区…’ TO OUTPUT-ADDRESS.

> レコードをファイルに書き込む
WRITE OUTPUT-RECORD.

> 2件目のデータを準備
MOVE ‘EMP0002 ‘ TO OUTPUT-ID.
MOVE ‘田中 一郎’ TO OUTPUT-NAME.
MOVE ‘福岡県博多区…’ TO OUTPUT-ADDRESS.

> レコードをファイルに書き込む
WRITE OUTPUT-RECORD.

> ファイルを閉じる
CLOSE OUTPUT-FILE.

> プログラム終了
STOP RUN.

このプログラムを実行すると、`OUTPUT-FILE`という名前のファイルが作成され、2件のレコードが書き込まれます。

【補足コメント】

  • `OPEN OUTPUT OUTPUT-FILE.`:`OUTPUT-FILE`を新しく作成し、書き込み用に開きます。もし同名のファイルが既に存在する場合は、上書きされます。
  • `MOVE ‘EMP0001 ‘ TO OUTPUT-ID.`:`PIC X(10)`で定義された項目にデータを格納する際、指定された長さ(ここでは10文字)に満たない場合は、通常、右側がスペースで埋められます。明示的にスペースを付与しておくことで、意図しないデータにならないようにします。
  • `WRITE OUTPUT-RECORD.`:`OUTPUT-RECORD`に格納されたデータを、`OUTPUT-FILE`に1レコードとして書き込みます。
  • `CLOSE OUTPUT-FILE.`:ファイルを閉じます。これにより、バッファに溜まっていたデータが確実にファイルに書き込まれ、ファイルリソースが解放されます。
  • `STOP RUN.`:プログラムの実行を終了します。

5. 応用と注意点

  • レコードレイアウトの厳守

FILE SECTIONで定義したレコード構造(項目の順番や長さ)と、実際に書き込むデータ、あるいは読み込むデータの構造は、厳密に一致させる必要があります。ズレがあると、データの破損やエラーの原因になります。

  • ファイル編成の指定

今回の例では順編成ファイルを想定していますが、COBOLにはインデックス編成など、他のファイル編成もあります。ファイル編成を指定する場合は、FD句に `ORGANIZATION IS INDEXED` などを記述します。

  • エラーハンドリング

実際の開発現場では、ファイルのオープンに失敗したり、書き込み中にエラーが発生したりする可能性も考慮し、エラーハンドリング(エラー発生時の処理)を記述することが重要です。例えば、`I-O-STATUS`句を使ってファイル操作のエラーコードを取得し、それに応じた処理を行います。

  • 文字コード

最近のシステムでは、日本語の文字コード(UTF-8など)の扱いが重要になることがあります。COBOLの標準機能だけでは扱いにくい場合もあるため、必要に応じて外部ライブラリなどを活用することも検討しましょう。

FILE SECTIONは、COBOLプログラムが外部とデータをやり取りするための「顔」とも言える部分です。今回学んだ基本をしっかりと押さえて、色々なファイル処理に挑戦してみてください!

コメント

タイトルとURLをコピーしました