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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。