前ページへファイルハンドラ API Rebuild次ページへ

第 8 章 ファイルのソート

COBOL プログラムで SORT 文を実行する場合、デフォルトでは、ランタイム COBOL ソートモジュールを使用します。さらに、この COBOL システムには、ファイルのソートとマージを行う方法が他に 2 種類あります。

8.1 Mfsort ユーティリティ

Mfsort を使用すると、データファイルのソートとマージが可能になります。Mfsort は、次のどちらかの方法で、コマンド行から起動されます。

mfsort instructions
mfsort take filename

各パラメータの内容は次のとおりです。

instructions

後述の『Mfsort 命令』の項を参照してください。

コマンド行で命令を指定する場合は、必ず次を実行してください。

  • オペレーティングシステムが定めたコマンド行の最大長を確認してください。

  • 次のどちらかの方法で、かっこやコメントなどの特殊文字をシェルで使用できるようにしてください。

    • 引用符、 "" を使用してかっこを囲みます。

    • かっこの場合は、各かっこの直前にエスケープ文字、 \ を入れます。コメントの場合は、* の直前にエスケープ文字、 \ を入れます。

filename Mfsort 命令を含むテキストファイル。後述の『Mfsort 命令』の項を参照してください。この方法は、多数の命令を指定する必要がある場合に使用してください。

8.2 Mfsort 作業ファイル

ソート操作中やマージ操作中に、Mfsort は一時作業ファイルを使用します。この作業ファイルは現行ディレクトリのディスクにページングされるます。または、 TMP 環境変数で指定されたディレクトリがある場合はそのディレクトリにページングされます。

Mfsort は、各入力ファイルからすべてのレコードを一時作業ファイルにコピーするときに、適宜、レコードの切り捨てや埋め込みを行います。次に、キー記述にしたがって、作業ファイルでソートやマージを行います。作業ファイルでのソートやマージが済むと、レコードは各出力ファイルにコピーされ、適宜、切り捨てられるか、埋め込まれます。

8.3 MFsort 命令

mfsort コマンドの一般的な形式を次に示します。

mfsort [*] [CHAR-EBCDIC] [SIGN-EBCDIC] {SORT|MERGE}
   fields(instructions,...) [record definition]
   {USE input-file}...
   {GIVE output-file}...
命令 説明
* 行の残りの部分はコメントとして処理されます。この命令は、ファイルに各命令の目的を説明するコメントを追加できるため、テキスト ファイルで命令を指定する場合に便利です。
CHAR-EBCDIC EBCDIC データを指定します。CHAR-EBCDIC は SORT 命令、MERGE 命令、USE 命令、GIVE 命令のすべてより先に指定する必要があります。
SIGN-EBCDIC 数字の DISPLAY 項目を指定し、符合は EBCDIC 規則にしたがって解釈されます。CHAR-EBCDIC が指定されている場合には SIGN-EBCDIC は不要ですが、データを作成したプログラムが SIGN"EBCDIC" コンパイラ指令でコンパイルされている場合のように、ASCII 以外のデータには SIGN-EBCDIC を設定する必要があります。 SIGN-EBCDIC は、すべての SORT 命令、MERGE 命令、USE 命令、GIVE命令より先に指定する必要があります。
SORT ソート操作を指定します。SORT 命令の次には、ソート操作に使用するフィールドを指定する FIELDS 命令を続ける必要があります。オプションで、ソート作業ファイルのレコードサイズと形式を指定する RECORD 命令を設定する場合は、SORT 命令の次に続けます。SORT 命令と MERGE 命令は相互に排他的に機能します。
MERGE マージ操作を指定します。この命令の次には、マージ操作に使用するフィールドを指定する FIELDS 命令を続けます。オプションで、ソート作業ファイルのレコードサイズと形式を指定する RECORD 命令を設定する場合は、MERGE 命令の次に続けます。MERGE 命令と SORT 命令は相互排他的に機能します。
fields (instructions)

ファイルのソートやマージを行うフィールド。後述の『FIELDS 命令』の項を参照してください。

record definition レコードサイズと形式。RECORD 命令は、作業ファイル、入力ファイル、出力ファイルの詳細を指定するために使用します。後述の『RECORD 命令』の項を参照してください。
USE input-file 各 USE 命令では、入力ファイルを指定します。USE 命令は必ず GIVE 命令の前に指定する必要があります。後述の『Mfsort の入力ファイルと出力ファイル』の項を参照してください。
GIVE output-file 各 GIVE 命令では、出力ファイルを指定します。後述の『Mfsort の入力ファイルと出力ファイル』の項を参照してください。

8.3.1 FIELDS 命令

SORT 命令や MERGE 命令の次には、入力ファイルのソートやマージを行うフィールドを指定する FIELDS 命令を続ける必要があります。

FIELDS 命令の形式を次に示します。

fields({start,length,type,order},...)
start レコード中のフィールドの開始位置。バイト 1 からカウントします。
length フィールドの長さ (バイト数)。
type フィールドのデータ型。後述の『フィールドの型』の項を参照してください。
order 出力の順番で、次のどちらかになります。
A - 昇順
D - 降順

パラメータセット (startlengthtypeorder) を繰り返すことにより、最大 16 フィールドを指定することができます。パラメータとパラメータセットはコンマで区切る必要があります。

8.3.1.1 フィールドの型

フィールドの型は、次のどれかになります。

定義
CH PIC X DISPLAY
NU PIC 9 DISPLAY
PD PIC S9 COMP-3
FI PIC s9.99 DISPLAY
BI COMP
C5 COMP-5
C6 COMP-6
S5 S9 COMP-5
CX COMP-X
LS PIC S9 LEADING SEPARATE
TS PIC S9 TRAILING SEPARATE
LI PIC S9 LEADING INCLUDED
TI PIC S9 TRAILING INCLUDED (コンパイルされた SIGN"EBCDIC")
SB S9 COMP

例えば、golf.dat という相対ファイルを COBOL プログラムで次のように定義することができます。

file-control.
select members-file
   assign to "/mydir/golf.dat"
   organization is relative
   access mode is random
   relative key is relative-key.
data division.
file section.
fd members-file
   record contains 28 characters.
01 members-record.
   03 members-number pic 9(6).
   03 members-lname pic x(10).
   03 members-fname pic x(10).
   03 members-handicap pic 9(2).

次の mfsort コマンドを使用すると、メンバーシップ番号を含むフィールドでファイル golf.dat をソートすることができます。

mfsort sort fields"(1,6,nu,a)"
   use golf.dat record f,28 org rl
   give members.dat

ソートしたファイルは、ファイル、 members.dat に書き込まれます。

8.3.2 Mfsort の入力ファイルと出力ファイル

入力ファイルを定義するには、次の命令を使用します。

USE input-file [record definition]
   [org organization] [key structure]

また、出力ファイルを定義するには、次の命令を使用します。

GIVE output-file [record definition] 
   [org organization] [key structure]

これらの命令は、関連付けた USE 命令や GIVE 命令のすぐ後に配置する必要があります。上記の命令を一部でも省略すると、前回に指定した値が使用されます。そのため、入力ファイルと出力ファイルをすべて同じ型と形式にする場合は、最初にファイルの値を指定すると後で指定し直す必要がありません。

8.3.2.1 RECORD 命令

RECORD 命令は、必要に応じて使用します。RECORD 命令を使用して、ソート作業ファイルで、レコードの形式と長さを指定します。また、関連付けられた USE 命令または GIVE 命令にしたがう場合は、入力ファイルと出力ファイルでもレコードの形式と長さを指定します。

RECORD 命令の形式は次のとおりです。

record format,rec-len,max-len
format

レコード形式で、次のどちらかになります。

F - 長さが rec-len の固定長レコード

V - 最小長が rec-len で、最大長が max-len の可変長レコード

ソート作業ファイルに対して RECORD 命令を指定しない場合は、ソート作業ファイルがデフォルトの固定長レコード形式になり、レコード サイズは USE 命令や GIVE 命令で指定された最大レコード長になります。

8.3.2.2 ORG 命令

ORG 命令では、ファイル編成を指定します。ファイル編成は、次のどれかになります。

IX - 索引
RL - 相対
SQ - 順
LS - 行順

ORG のデフォルト値は SQ です。

8.3.2.3 KEY 命令

KEY 命令では、ファイルのキー構造体を指定するため、索引ファイルには必ず指定する必要があります。他のファイル編成には関係ありません。

KEY 命令の形式を次に示します。

key ({start,length,ixkey},...)
start レコード中のキーの開始位置。バイト 1 からカウントします。
length キーのバイト数。
ixkey 次のどれかになります。
P - 主キー (常に最初に定義します)
A - 副キー
AD - 重複指定した副キー
C - 前回指定した主キーまたは副キーの構成要素

KEY 命令は、キー構造体全体を記述するために必要に応じて反復します。パラメータとパラメータセット (start, length, ixkey) はコンマで区切る必要があります。

キーは、重要な順に定義します。主キー、主キーが分割されている場合はすべての構成要素、最初の副キー、そのすべての構成要素という順序で定義する必要があります。

次の例では、3 つのキーを定義します。

key (4,5,p,10,5,c,20,2,ad,40,2,a,46,10,c)

最初のキーである主キーは、文字位置 4 から始まる長さ 5 バイトの最初の構成要素と文字位置 10 から始まる長さ 5 バイト 2 番目の構成要素に分割されます。

2 番目のキー (副キー) は重複可能で、文字位置 20 で始まり、長さが 2 バイトになります。

3 番目のキーは副キーで、文字位置 40 から始まる長さが 2 バイトの最初の構成要素と、文字位置 46 から始まる長さ 10 バイトの 2 番目の構成要素に分割されます。

8.4 Mfsort コマンド例

国内の東西南北の 4 地域について、国内大会で国内組織のメンバーが達成したスコアを記録した索引ファイル(north.datsouth.dateast.dat および west.dat)がそれぞれ 1 つずつ、計 4 つあると想定します。このうち、 north.dat を定義するには、次のような COBOL 構文を使用します。

file-control.
   select idxfile assign to "north.dat"
      organization is indexed
      record key is member-id.
data division.
file section.
fd idxfile
record contains 39 characters.
01 idxfile-record.
   03 member-id  pic 9(6).
   03 surname    pic x(15).
   03 first-name pic x(15).
   03 score      pic 9(3).

さらに、他のファイルも同様の方法で作成し、大会の結果をファイルに入力したと仮定します。

次の mfsort コマンドでは、これら 4 つのファイルを取り出し、メンバーの姓でソートしてから、相対ファイル、 members.dat に結果を出力します。

mfsort sort fields"(7,15,ch,a)"
   use north.dat org ix record f,39 key"(1,6,p)"
   use south.dat
   use east.dat
   use west.dat
   give members.dat org rl

次の mfsort コマンドでは、4 つのファイルを取り出し、メンバーのスコア順 (スコアの高い順に並べる) でソートしてから、その結果を相対ファイル、 scores.dat に出力します。

mfsort sort fields"(37,3,nu,d)"
   use north.dat org ix record f,39 key"(1,6,p)"
   use south.dat
   use east.dat
   use west.dat
   give scores.dat org rl

次の mfsort コマンドでは、4 つのファイルを取り出し、メンバーのスコア順 (スコアの高い順に並べる) でソートしてから、その結果を相対ファイル、 national.dat に出力します。

mfsort fields"(1,6,nu,a)"
   use north.dat org ix record f,39 key"(1,6,p)"
   use south.dat
   use east.dat
   use west.dat
   give national.dat

8.5 Mfsort エラーメッセージ

Mfsort エラーメッセージの詳細なリストを次に示します。

Instructions are needed
SORT or MERGE already specified
Failed to open filename
Failed to read filename
Invalid or illegal syntax
Unsupported syntax
Unable to get enough memory, aborting
Too many input files
Too many output files specified
All input files must be specified before specifying output files
Record format not specified
SORT failure, file status code: status
Please specify EBCDIC before other arguments
SIGN-EBCDIC incompatible with CHAR-EBCDIC
Prime key not specified first
Key description missing for ISAM file


Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標と商品名は国際法で保護されています。

前ページへ ファイルハンドラ API Rebuild次ページへ