Web教材一覧アルゴリズム

ファイル処理のアルゴリズム

キーワード

最小値・最大値、抽出処理、結合(join)、コントロールブレーク、併合処理(マージ)、整列処理(外部ソート)


対象と本章での注意事項

順編成ファイルを順アクセスで読込み、典型的な処理をするアルゴリズムを列挙します。

このような処理は、定例的な事務処理で多く用いられ、歴史的にはCOBOLやPL/Iなどの言語が広く用いられていましたが、現在ではデータベース用の言語が用いられるようになりました。それらは非手続言語でアルゴリズムの説明には不適切です。また、スクリプト言語では、このような処理を重視していません。
 そのため、ここでは疑似言語を用います。

これらの処理では、ファイルのレコードを読み終わった(end of file, EOF)ことをプログラムに知らせる方法が言語によりまちまちです。
  COBOL: READ ファイル AT END ~ で、終了時の処理を記述します。
  C: 自動的に予約語 EOF を true にします。
  Java:読み込む場所(文字列変数)を null にします。
のようにまちまちです。そのため、ここの疑似言語では、変数 EOF を true/false にする手段は省略して、
   ファイルにレコードが残っている状態を EOF=false, 読み終わった状態を EOF = true
であるとします。

個々のプログラムによる個別処理の部分は、ここではサブルーチンとして記述することにしており、そのサブルーチンを省略しています。サブルーチンをメインルーチンの呼出個所(call命令)に埋め込んでもかまいません。


最小値・最大値

call ファイル読込みを最初と whileループの最後に記述することがポイントです。


抽出処理


結合(join)

例えば、順編成の売上ファイルのフィールドには商品コードはあるが商品名はありません。商品名は商品コードを主キーとする直接アクセスファイル(あるいはデータベース)の商品マスタファイルにあり、両ファイルの商品コードをキー項目として結合して、売上ファイルに商品名を取り込む処理です。


コントロールブレーク処理(小計、総計)

ファイルは、事前にレコードのフィールドにある小計キーでソート(昇順でも降順でもよい)してあるものとします。
 次のような出力になります。
  明細
  明細
   小計
  明細
   小計
    総計

  

コントロールブレーク処理(小計、中計、総計)

最も深いネストに call ファイル読込 を置くことがポイントです。


併合処理(マージ)

2つの順編成ファイル、AファイルとBファイルがあり、それぞれ大小を比較するキー、AキーとBキーの昇順にソートしてあります。このA、Bのファイルを読み、比較キーの小さい順にCファイルに出力します。なお、ファイル読込みでは、A・Bファイルのレコードがなくなったとき、Aキー、Bキーの値を HIGH_VALUE に設定することにします。→参照:マージ(併合)


整列処理(外部ソート)

AファイルをAキー項目の昇順にソートします(元のAファイルの内容は保存されません)。ワークファイルとして、BファイルとCファイルを用います。

大きく分割フェーズとマージフェーズの繰り返しでソートします。 外部ソート

分割フェーズ

  1. Aキーが昇順になっている(Aキー >= 前Aキー)の間(連といいます)は、B・Cの一方のワークファイル(カレントファイル)に書き込みます。
  2. 連が切れた(Aキー < 前Aキー)ら、カレントファイルを切り替えて(B⇔C)、Aをカレントファイルに書き込みます。
  3. これにより、Aファイルの全レコードがB・Cに書き込まれたことになります。
    2が発生しないときは、Aファイルのソートが完了していることになります。

マージフェーズ

  1. BファイルとCファイルをマージしてAファイルを作成します。
  2. 分割フェーズに戻ります。