COBOLでファイルにデータを書き込みたいけど、「WRITE文ってどう使うの?」「なんだか難しそう…」なんて思っていませんか?
この記事では、COBOLのファイル出力で欠かせないWRITE文について、ゼロから丁寧に解説していきます。基本の書き方から、実際に動くサンプルコード、ちょっと応用的な使い方、そして「あちゃー!」となりがちな注意点まで、しっかり網羅していますよ。
読み終わるころには、「なるほど、WRITE文ってこう使うのか!」とスッキリ理解できているはず。さあ、一緒にCOBOLのファイル出力マスターを目指しましょう!
この記事で学べること
- WRITE文が何をする命令なのか
- WRITE文の基本的な書き方のルール
- 簡単なファイル出力プログラムの作り方
- WRITE文を使った改行や改ページの制御方法
- WRITE文を使うときに気をつけたいポイント
COBOLの「WRITE文」とは?ファイル出力の心臓部
COBOLのWRITE文は、プログラムで作ったデータや計算結果を、ファイルという名の「ノート」に書き込むための命令です。ちょうど、レポートを書いて紙に出力するようなイメージですね。
ファイル出力の処理は、ざっくり言うとこんな流れになります。
- ファイルを使う準備をする(OPEN)
- 書き込みたいデータを用意する(MOVEとか)
- 実際にファイルに書き込む(WRITE) ← ココ!
- 使い終わったファイルを片付ける(CLOSE)
WRITE文は、この流れの中で実際に「書き込む」という、まさに心臓部とも言える役割を担っています。
だから、COBOLでファイル操作をしたいなら、WRITE文の理解は避けて通れない道なのです。でも、安心してください。基本さえ押さえれば、決して難しいものではありませんよ。
「WRITE文」の基本的な書き方
まずは、WRITE文の基本的な形、つまり書き方のルール(構文)を見てみましょう。一番シンプルな形は、これだけです。
WRITE レコード名.
たったこれだけ?と思うかもしれませんが、基本は本当にシンプルなんです。
WRITEこれは「書き込みますよ!」という命令そのものです。レコード名これは、事前に「こういう形式でデータを書き込みます」と定義しておいた「データの入れ物」の名前を指定します。この「データの入れ物」の定義は、DATA DIVISIONのFILE SECTIONという場所で、FD句を使って行います。(後でサンプルコードで詳しく見ますね!)- 最後の
.(ピリオド) を忘れずに!COBOLでは文の終わりにピリオドが必要です。
まずは「WRITE 書き込みたいデータの入れ物名.」という形を、呪文のように覚えてしまいましょう!
「WRITE文」の使い方:シンプルなファイル出力サンプル
では、実際にWRITE文を使った簡単なプログラムを見ていきましょう。ここでは、「OUTPUT.TXT」というファイルに「HELLO COBOL WORLD!」という文字を書き込むサンプルです。
IDENTIFICATION DIVISION.
PROGRAM-ID. SIMPLE-WRITE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OUTPUT-FILE ASSIGN TO 'OUTPUT.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD OUTPUT-FILE.
01 OUTPUT-RECORD PIC X(20).
WORKING-STORAGE SECTION.
PROCEDURE DIVISION.
OPEN OUTPUT OUTPUT-FILE.
MOVE 'HELLO COBOL WORLD!' TO OUTPUT-RECORD.
WRITE OUTPUT-RECORD.
CLOSE OUTPUT-FILE.
STOP RUN.
このプログラムを実行すると、プログラムがあるフォルダに「OUTPUT.TXT」というファイルが作られ、その中に文字が書き込まれます。
サンプルプログラムの解説
ちょっと長いプログラムに見えますが、一つずつ見ていけば大丈夫です。
ENVIRONMENT DIVISIONのFILE-CONTROL
ここでは、プログラムの中で使うファイルの名前(論理ファイル名:OUTPUT-FILE)と、実際にパソコン上に作られるファイルの名前(物理ファイル名:OUTPUT.TXT)を結びつけています。「このプログラムでOUTPUT-FILEって言ったら、OUTPUT.TXTのことね」と教えている感じです。DATA DIVISIONのFILE SECTION(FD句)
FD OUTPUT-FILE.で、先ほど関連付けたOUTPUT-FILEの詳しい情報を定義しますよ、という宣言です。
その下の01 OUTPUT-RECORD PIC X(20).で、実際に書き込むデータを入れるための「レコード」を定義しています。ここではOUTPUT-RECORDという名前で、20桁の文字データが入る領域を確保しています。このPIC X(20)がデータの形式や長さを示します。PROCEDURE DIVISION(手続き部)
ここが実際の処理を書く部分です。OPEN OUTPUT OUTPUT-FILE.
まず、ファイルを書き込み可能な状態にするために「開きます」(オープン)。OUTPUTモードは「新規書き込み」または「上書き」用です。MOVE 'HELLO COBOL WORLD!' TO OUTPUT-RECORD.
書き込みたい文字データを、先ほどFD句で定義したレコード領域OUTPUT-RECORDに移動(MOVE)させています。WRITE OUTPUT-RECORD.
いよいよ主役の登場!OUTPUT-RECORDに入っている内容を、OUTPUT-FILE(つまりOUTPUT.TXT)に書き込みます。ここで指定するレコード名は、FD句で定義したものと一致させる必要があります。CLOSE OUTPUT-FILE.
書き込みが終わったら、ファイルを「閉じます」(クローズ)。これを忘れると、データが正しく書き込まれないことがあるので、必ず行いましょう。STOP RUN.
プログラムの処理を終了します。お疲れ様でした!
実行結果の確認
上記のサンプルプログラムを実行すると、OUTPUT.TXT というファイルが作成され、その中身は以下のようになります。
HELLO COBOL WORLD!
ちゃんと、MOVE命令でセットした文字が書き込まれていますね! PIC X(20) で20桁確保しましたが、実際のデータが短い場合は、その長さ分だけが書き込まれ、後ろに余計な空白などは(通常)つきません(これはORGANIZATION IS LINE SEQUENTIAL のおかげでもあります)。
思った通りにデータがファイルに書き出されるのを確認できると、嬉しいものですよね。
【応用編】「WRITE文」の便利オプション(ADVANCING句)
基本的な書き方だけでもファイル出力はできますが、帳票(レポートや伝票など)を作成するときには、「書き込んだ後に改行したい」とか「次のページの頭から書きたい」といった制御が必要になります。
そんな時に活躍するのが ADVANCING句 オプションです。これをWRITE文に追加することで、書き込み前後の改行や改ページをコントロールできるのです。
プリンターで印刷するときの紙送りをイメージすると分かりやすいかもしれません。
ADVANCING句 には、主に書き込み後に紙送りする AFTER ADVANCING と、書き込み前に紙送りする BEFORE ADVANCING の2種類があります。
AFTER ADVANCING句の使い方
AFTER ADVANCING は、「指定したレコードを書き込んだ後」に改行や改ページを行います。一番よく使うパターンかもしれません。
書き方例
* 書き込み後、1行改行する WRITE OUTPUT-RECORD AFTER ADVANCING 1 LINE. * 書き込み後、3行改行する WRITE OUTPUT-RECORD AFTER ADVANCING 3 LINES. * 書き込み後、次のページの先頭に移動する (改ページ) WRITE OUTPUT-RECORD AFTER ADVANCING PAGE.
例えば、AFTER ADVANCING 1 LINE を使うと、データを1行書き込んだ後に、カーソル(書き込み位置)が次の行の先頭に移動します。連続してWRITEすれば、1行ずつデータが書き込まれていくイメージです。帳票の明細行などを出力するときによく使われます。
BEFORE ADVANCING句の使い方
BEFORE ADVANCING は、「指定したレコードを書き込む前」に改行や改ページを行います。
書き方例
* 1行改行してから、書き込む WRITE OUTPUT-RECORD BEFORE ADVANCING 1 LINE. * 2行改行してから、書き込む WRITE OUTPUT-RECORD BEFORE ADVANCING 2 LINES. * 次のページの先頭に移動してから、書き込む (改ページ) WRITE OUTPUT-RECORD BEFORE ADVANCING PAGE.
例えば、「見出しを書き出す前に必ず改ページしたい」といった場合に BEFORE ADVANCING PAGE が使えます。
AFTER と BEFORE は、処理の順番が逆になるだけで、指定できる内容はほぼ同じです。どちらを使うかは、プログラムの処理の流れや、作りたい帳票のレイアウトによって使い分けると良いでしょう。
COBOLの「WRITE文」を使う上での注意点
WRITE文は便利ですが、いくつか注意しないとエラーになったり、思った通りに動かなかったりすることがあります。よくある落とし穴をいくつか紹介しますね。
- ファイルが開かれていない、またはモードが違う
WRITE文を使う前に、必ずファイルを書き込み可能なモード (OUTPUTまたはI-O) でOPENする必要があります。OPENを忘れたり、読み取り専用のINPUTモードで開いているファイルに書き込もうとすると、エラーが発生します。「あれ、書き込めないぞ?」と思ったら、まずOPEN文を確認しましょう。 - レコード名の間違い
WRITE文で指定するレコード名は、FD句で定義したレコード名と完全に一致させる必要があります。タイプミスなどがあると、コンパイルエラーになります。 - データ桁数とレコード定義の不一致
MOVEなどでレコードにセットするデータの桁数が、FD句で定義したレコードの桁数(PIC句で指定した桁数)を超えてしまうと、データの一部が欠けてしまったり、意図しない場所に書き込まれたりする可能性があります。書き込むデータの長さには注意を払いましょう。 - ADVANCING句とファイルの種類の相性
ADVANCING句は、主に帳票出力(プリンターへの出力)を想定した機能です。通常のデータファイルに対して使うと、意図しない制御コードが埋め込まれたり、環境によっては無視されたりすることがあります。通常のデータファイルならADVANCING句なしでWRITEし、テキストエディタで扱いやすいように改行コードを含めたい場合は、レコード定義自体に改行コードを含めるなどの工夫が必要になる場合もあります。
これらの点に気をつけるだけで、WRITE文のエラーはかなり減らせるはずです!
「WRITE文」を使った実践的なファイル出力処理の流れ
最後に、もう少しだけ実践的な例として、ループ処理を使って複数行のデータをファイルに書き込む処理の流れを見てみましょう。ここでは、1から5までの数字をそれぞれ別の行に書き出すサンプルです。
IDENTIFICATION DIVISION.
PROGRAM-ID. LOOP-WRITE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT NUM-FILE ASSIGN TO 'NUMBER.TXT'
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD NUM-FILE.
01 NUM-RECORD PIC X(5). * 少し余裕を持たせた桁数
WORKING-STORAGE SECTION.
01 WS-COUNTER PIC 9(1) VALUE 1.
PROCEDURE DIVISION.
* ファイル書き込み準備
OPEN OUTPUT NUM-FILE.
* WS-COUNTERが5以下の間、処理を繰り返す (ループ処理)
PERFORM UNTIL WS-COUNTER > 5
* カウンターの値をレコードにセット
MOVE WS-COUNTER TO NUM-RECORD
* レコードを書き込み (1行改行付き)
WRITE NUM-RECORD AFTER ADVANCING 1 LINE
* カウンターを1増やす
ADD 1 TO WS-COUNTER
END-PERFORM.
* ファイルの後片付け
CLOSE NUM-FILE.
* プログラム終了
STOP RUN.
このプログラムでは、PERFORM UNTIL ... END-PERFORM というループ構文を使っています。
WS-COUNTERという変数を用意し、初期値を1にします。WS-COUNTERが5より大きくなるまで、以下の処理を繰り返します。- 現在の
WS-COUNTERの値をNUM-RECORDにセットします。 WRITE NUM-RECORD AFTER ADVANCING 1 LINEで、レコードの内容をファイルに書き込み、改行します。WS-COUNTERの値を1増やします。- ループの最初に戻り、
WS-COUNTERが5より大きいかチェックします。
この結果、「NUMBER.TXT」ファイルには以下のように出力されます。
1 2 3 4 5
このように、ループ処理とWRITE文を組み合わせることで、大量のデータを効率的にファイルへ書き出すことができます。実際の業務プログラムでは、このような繰り返し処理が非常によく使われます。
【まとめ】COBOLの「WRITE文」を理解して使いこなそう!
今回は、COBOLのファイル出力の基本となるWRITE文について解説してきました。最後に、今回のポイントをまとめておきましょう。
- WRITE文は、ファイルにデータを書き込むための命令。
- 基本の形は
WRITE レコード名.で、FD句で定義したレコード名を指定する。 - ファイルは書き込み前に
OPEN OUTPUT(またはI-O) する必要がある。 ADVANCING句を使うと、書き込み前後の改行や改ページを制御できる。AFTER ADVANCINGは書き込み後に処理。BEFORE ADVANCINGは書き込み前に処理。
OPEN忘れ、レコード名のミス、データ桁数に注意する。- ループ処理と組み合わせることで、複数データの書き込みも効率的に行える。
どうでしたか? WRITE文の使い方が、だいぶイメージできたのではないでしょうか。
最初は戸惑うこともあるかもしれませんが、実際にコードを書いて動かしてみるのが一番の近道です。今回のサンプルコードなどを参考に、ぜひ自分の手で試してみてくださいね。
WRITE文をマスターすれば、COBOLでのファイル操作がぐっと楽になります。自信を持って、次のステップに進んでいきましょう!
【関連記事】


0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。