日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
OpenVMS
|
目次 | 索引 |
9.2.2 複数のキー・フィールドの使用方法 |
2 つ以上のキー (255 キーが上限 ) でソートを行うことができます。この場合には,複数のキーを優先順位順に指定します。すなわち,最初に 1 次キーを,次に 2 次キーを指定し,以下も同様になります。また別の方法として,NUMBER:n を使用して,キーの優先順位を指定する方法もあります。それぞれのキーは昇順でも降順でもかまいません。
たとえば,次のコマンドは,EMPLOYEE.LST を最初に従業員名をキーとしてソートし,次に ( 同一名があれば ) アカウント番号順にソートします。
$ SORT /KEY=(POSITION:10,SIZE:15,CHARACTER) - _$ /KEY=(POSITION:5,SIZE:4,DECIMAL) EMPLOYEE.LST BILLING2.LST |
ソート結果を 図 9-5 に示します。
図 9-5 複数のキー・フィールドによるソート結果
それぞれのキーは昇順でも降順でもかまいません。たとえば,次のコマンドは,最初にレコードを部門名別に降順にソートしてから,次に従業員名別に昇順にソートします。
$ SORT/KEY=(POSITION:1,SIZE:3,DESCENDING) - _$ /KEY=(POSITION:10,SIZE:15) - _$ EMPLOYEE.LST BILLING3.LST |
ソート結果を 図 9-6 に示します。
図 9-6 昇順および降順キーによるソート結果
9.2.3 同一キー・フィールドによるレコードのソート |
省略時の設定では,Sort/Merge は同一キー・フィールドでレコードを保持しますが,それらのレコードを,入力ファイル中で現れた順序と同じ順序で保持するとは限りません。このようなレコードが存在すると思われる場合には,次の修飾子のいずれかを使用してその扱い方を指定することができます。
/STABLE 修飾子と /NODUPLICATES 修飾子は互換性がないため,同一コマンド行で両方の修飾子を指定することはできません。
次の例では,アカウント番号が重複するレコードは,ファイル EMPLOYEE.LST から削除されます。
$ SORT /KEY=(POSITION:5,SIZE:4)/NODUPLICATES EMPLOYEE.LST BUDGET.LST |
図 9-7 はこのソート操作の結果を示しています。
図 9-7 同じキーを持つ場合のソート結果
9.2.4 非文字データ・ファイルのソート |
文字データ以外の項目を含むレコードをソートする場合は,それぞれのキーでデータ型を指定します。また,比較する項目が2バイト以上占有することもあるため,開始位置とサイズを注意深く計算するようにします。
20 個の文字の後に,F_floating 形式の浮動小数を 3 つ含むファイルをソートする場合,位置は次のようになります。
3 番目の浮動小数でファイルをソートするときは,キー・フィールドを次のように指定します。
$ SORT/KEY=(POSITION:29,F_FLOATING) STATS.RAW STATS.SOR |
浮動小数のサイズは 4 バイトに固定されているため,サイズを指定する必要はありません。
9.2.5 出力ファイルの編成
省略時の設定では,Sort は,最初の入力ファイルと同じファイル編成の出力ファイルを生成します。入力ファイルと異なる出力ファイル編成を指定するときは,Sort のコマンド行で出力ファイルを指定した後に次のいずれかの修飾子を指定します。
次の例では,索引付き順編成ファイル EMPLOYEE.LST をソートした後,順編成ファイルが作成されます。
$ SORT/KEY=(POSITION:10,SIZE:15) - _$ EMPLOYEE.LST BYNAME.LST/SEQUENTIAL |
Sort は,レコード,タグ,アドレス,索引などの内部プロセスを 1 つ使用して,ファイルの整列を行います。( 高性能 Sort/Merge ユーティリティでは,レコード・プロセスのみがサポートされます。タグ,アドレス,索引の各プロセスについては, OpenVMS Alphaの将来のリリースでサポートされる予定です。) 指定するプロセスによっては,Sort 操作の効率が変わることもあります。 Sort 操作,Merge 操作の最適化については, 第 9.8 節 を参照してください。
次の表は,プロセスの 4 つのタイプを示しています。ソート・プロセスを指定するときは, /PROCESS=タイプ 修飾子を使用します。
ソート・プロセス | タイプ | 説明 |
---|---|---|
レコード | RECORD | ソートを行うときレコードを完全な状態のまま残し,完全なレコードで構成される出力ファイルを作成する。レコードが省略時のソート・プロセスになる。 |
タグ | TAG | キー・フィールドのみをソートしてから,入力ファイルを読み込み直し,完全なレコードの出力ファイルを作成する。実際の結果は,完全なレコード・ソートの場合と同じになる。
タグ・ソートは通常,ソート時に作業ファイルの領域をあまり使用しないため,ディスク領域が少ない場合に使用するのに適している。ほとんどの場合,タグ・ソートは,レコード・ソートよりも処理速度が遅くなる。これは,入力ファイルを読み込み直すときに余分の時間が必要になるためである。 |
アドレス | ADDRESS | キー・フィールドのみをソートし,
レコード・ファイル・アドレス(RFA)の索引になる出力ファイルを,バイナリ形式で作成する。
アドレス・ソートは,レコード・ソートよりも高速であるが,レコード・アドレスを入力ファイルのレコードと対応させるプログラムを記述する必要がある。 |
索引 | INDEX | キー・フィールドのみをソートし,キーとRFAの出力ファイルを(バイナリ形式で)作成する。
アドレス・ソートの場合と同様に,索引ソートもレコード・ソートより高速であるが,レコード・アドレスを入力ファイルのレコードと対応させるプログラムを記述する必要がある。 |
文字は,照合順序 の順番に従って,ソートされます。文字データを含むファイルの場合は, /COLLATING_SEQUENCE=sequence 修飾子を使用して,照合順序を指定します。次の表は,照合順序オプションについて説明しています。
照合順序 | 順序 | 説明 |
---|---|---|
ASCII | ASCII | 文字データの場合,省略時の照合順序になる。 ASCII 順序では,数字 (0 〜 9),大文字 (A 〜 Z),小文字 (a 〜 z) の順番になる。 |
EBCDIC | EBCDIC | EBCDIC 順序で並べられた出力ファイルを生成する。データは ASCII 表現のままになる。 EBCDIC 順序では,小文字 (a 〜 z),大文字 (A 〜 Z),数字 (0 〜 9) の順番になる。 |
DEC で定義している文字セット | MULTINATIONAL | MULTINATIONAL 照合順序では,DEC で定義している文字セットに従って文字を整列させる ( 付録 A を参照 )。 MULTINATIONAL の文字順序では,文字は次の規則で並べられる。
|
国別文字セット(NCS) | 照合順序名 | 指定する照合順序は,NCS ライブラリで定義されていなければならない。詳細は,『OpenVMS National Character Set Utility Manual』を参照。
( 高性能 Sort/Merge ユーティリティは,NCS 照合順序をサポートしていない。 OpenVMS Alpha の将来のリリースでサポートされる予定である。) |
ユーザ定義順序 | (順序文字列) | ユーザ定義照合順序を指定する。ユーザ定義照合順序は,指定ファイルでのみサポートされており,コマンド行インタフェースではサポートされていない。
( 高性能 Sort/Merge ユーティリティは,ユーザ定義順序をサポートしていない。 OpenVMS Alpha の将来のリリースではサポートされる予定である。) |
単一文字または二重文字の文字列,あるいは単一の文字を複数集めた文字の集まりを指定することによって,照合順序を定義する。二重文字は,単一の文字を2つ集めて1文字のように扱う。たとえば,整列するときに "CH" を "C" として扱うよう定義することができる。この文字列は括弧で囲んで指定する。
基数演算子 %O,%D,%X を使用して,それぞれ 8 進,10 進,16 進の値で,文字を表現することもできる。 照合順序を定義するとき,次の規則を守らなければならない。
次の文字列は,二重文字 LL が L と M の間の単一文字として照合される照合順序を定義する。
|
注意 DEC で定義している照合順序を使用して,ファイルをソートまたはマージするときには注意が必要です。ほとんどのプログラミング言語のシーケンス・チェック・プロシージャは,数字を比較します。DEC で定義している照合順序は,グラフィック文字を表すコードを比較するのではなく,実際のグラフィック文字を比較するため,通常のシーケンス・チェックは正しく動作しません。 |
次の例は,指定ファイルで使用するために,ユーザ定義照合順序を作成する方法を示しています。指定ファイルについての詳細は, 第 9.7 節 を参照してください。
(/COLLATING_SEQUENCE=(SEQUENCE=ASCII,IGNORE=("-"," ")) |
このように,/COLLATING_SEQUENCE 修飾子に IGNORE オプションを指定した場合,次のフィールドが比較されるとき同じものとして扱われ,タイブレークになります。
252-3412 252 3412 2523412 |
/COLLATING_SEQUENCE=(SEQUENCE=("A"-"L","LL","M"-"R","RR","S"-"Z")) |
この /COLLATING_SEQUENCE 修飾子は,二重文字 LL が L と M の間の単一文字として照合され,二重文字 RR が R と S の間の単一文字として照合される順序を定義します。このような定義がなければ,これらの二重文字は,通常のアルファベット順と同様になります。省略時の場合,このユーザ定義順序によって,小文字の a から z のような,他の文字が定義されることはありません。
バッチ・ジョブとは,現在のセッションとは独立して実行するプログラムや DCL コマンド・プロシージャのことです。大きなファイルをソートする場合には,ソート操作を終了するまでに時間がかかるので,ソート操作をバッチ・ジョブとして登録することを検討してみてください。バッチ・ジョブは,現在のセッションとは独立してバッチ・ジョブとコマンド・プロシージャについての詳細は, 第 16 章 , 第 13 章 ,および 第 14 章 を参照してください。
9.4.1 コマンド・プロシージャ
コマンドを画面に記述するのと同様の方法で,コマンド・プロシージャに SORT コマンドを指定します。省略時のディレクトリにソートするファイルがない場合は,コマンド・プロシージャで省略時のディレクトリを明示的に設定するか,コマンド・ファイル指定にディレクトリを入れるようにします。
次の例では, DCL コマンド・プロシージャ SORTJOB.COM をバッチ・ジョブとして登録しています。コマンド・プロシージャのテキストをコマンド行の後に示します。
$ SUBMIT SORTJOB |
! SORTJOB.COM ! $ SET DEFAULT [USER.PER] ! Set default to location of input files $ SORT/KEY=(POSITION:10,SIZE:15) EMPLOYEE.LST BYNAME.LST $ TYPE BYNAME.LST $ EXIT |
バッチ・ジョブには,入力レコードを含めておくことができます。これには,SORT コマンドの後に入力レコードを 1 行に 1 つずつ指定します。ただし,個々のソート・レコードは 2 行以上になってもかまいません。
レコードをターミナルから入力する場合と同様に,入力ファイル・パラメータには SYS$INPUT を指定します。その後に /FORMAT 修飾子を使用して,レコード・サイズ ( バイト数 ) とおおよそのファイル・サイズ(ブロック数)を指定します。 80 文字の行が 6 行で 1 ブロックとほぼ等しくなります。
次の例は,入力レコードを含めたコマンド・プロシージャを示しています。
$ SUBMIT SORTJOB |
! SORTJOB.COM ! $ SET DEFAULT [USER.PER] $ SORT/KEY=(POSITION:10,SIZE:15) - SYS$INPUT- /FORMAT=(RECORD_SIZE:24,FILE_SIZE:10) - BYNAME.LST $ DECK BST 7828 MCMAHON JANE ADM 7933 ROSENBERG HARRY COM 8102 KNIGHT MARTHA ANS 8042 BENTLEY PETER BIO 7951 LOWELL FRANK $ EOD |
MERGE コマンドは,最大で 10 個 ( 高性能 Sort/Merge ユーティリティの場合は,最高で 12 個 ) のソート済みのファイルをまとめて,レコードが順に並べられた 1 つの出力ファイルを作成します。マージする入力ファイルは,同じ形式を持ち,同じキー・フィールドに基づいてソートされていなければなりません。
省略時の設定では,Merge は,入力ファイルの中のレコードをチェックして,正しい順序で並べられているかどうかを確認します。 Merge で順序をチェックする必要がなければ, /NOCHECK_SEQUENCE 修飾子を指定します。 /CHECK_SEQUENCE 修飾子を指定し,レコードの順序が正しくない場合, ( たとえば,入力ファイルのどれかをソートしていなかった場合 ), Merge では以下のエラーをレポートします。
%SORT-W-BAD_ORDER, merge input is out of order |
MERGE コマンドと SORT コマンドは,同じ修飾子を使用できます。ただし,次の 2 つの例外があります。
次の例では,ファイル BYNAME1.LST と BYNAME2.LST は,従業員名によってすでに昇順にソートされています。ここに示したコマンドは,これらをマージします。
$ MERGE BYNAME1.LST,BYNAME2.LST BYNAME3.LST |
出力ファイル BYNAME3.LST には,次の図に示すように, BYNAME1.LST と BYNAME2.LST の両方のファイルのすべてのレコードが含まれます。
目次 | 索引 |
|