OpenVMS
ユーザーズ・マニュアル


前へ 次へ 目次 索引


次に,EMPLOYEE.LST のレコードをソートする例を示します。

  1. 次の例では,EMPLOYEE.LST はアカウント番号によってソートされ,アカウント番号フィールドを記述するために /KEY 修飾子を使用しています。


    $ SORT/KEY=(POSITION:5,SIZE:4,DECIMAL) EMPLOYEE.LST BILLING1.LST
    


    このコマンドは,キー・フィールド(アカウント番号)が位置 5 から始まること,長さが 4 文字であること,10 進データが格納されていること,昇順(省略時の設定)でソートすることを指定しています。ソート結果を 図 9-3 に示します。

    図 9-3 キー・フィールドによるソート


  2. 次の例は,キー・フィールドを指定せずに,ファイル EMPLOYEE.LST をソートする方法を示しています。


    $  SORT EMPLOYEE.LST BYDEPT.LST
    


    キーを指定していないので省略時の特性が使用されます。ソートの結果を 図 9-4 に示します。

    図 9-4 ソート済みリスト(キー・フィールドなし)



    Sort は,EMPLOYEE.LST の中のそれぞれレコードを 1 つの文字データ・キーとして使用します。この例では,各レコードは,部門名,アカウント番号,従業員名で構成されています。重複する部門名がある場合,それらの部門名をアカウント番号の昇順にソートします。さらにアカウント番号もいくつか重複していた場合は,従業員名のアルファベット順にソートします。ここでアカウント番号はレコードの一部であることに注意してください。特に指定しない限り,アカウント番号は文字データとして処理されます。

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

9.2.6 ソートのプロセス

Sort は,レコード,タグ,アドレス,索引などの内部プロセスを 1 つ使用して,ファイルの整列を行います。(高性能 Sort/Merge ユーティリティでは,レコード・プロセスのみがサポートされます。タグ,アドレス,索引の各プロセスについては,OpenVMS Alphaの将来のリリースでサポートされる予定です。)指定するプロセスによっては,Sort 操作の効率が変わることもあります。Sort 操作,Merge 操作の最適化については,第 9.8 節 を参照してください。

次の表は,プロセスの 4 つのタイプを示しています。ソート・プロセスを指定するときは,/PROCESS=タイプ 修飾子を使用します。

ソート・プロセス タイプ 説明
レコード RECORD ソートを行うときレコードを完全な状態のまま残し,完全なレコードで構成される出力ファイルを作成する。レコードが省略時のソート・プロセスになる。
タグ TAG キー・フィールドのみをソートしてから,入力ファイルを読み込み直し,完全なレコードの出力ファイルを作成する。実際の結果は,完全なレコード・ソートの場合と同じになる。

タグ・ソートは通常,ソート時に作業ファイルの領域をあまり使用しないため,ディスク領域が少ない場合に使用するのに適している。ほとんどの場合,タグ・ソートは,レコード・ソートよりも処理速度が遅くなる。これは,入力ファイルを読み込み直すときに余分の時間が必要になるためである。

アドレス ADDRESS キー・フィールドのみをソートし, レコード・ファイル・アドレス(RFA)の索引になる出力ファイルを,バイナリ形式で作成する。

アドレス・ソートは,レコード・ソートよりも高速であるが,レコード・アドレスを入力ファイルのレコードと対応させるプログラムを記述する必要がある。

索引 INDEX キー・フィールドのみをソートし,キーとRFAの出力ファイルを(バイナリ形式で)作成する。

アドレス・ソートの場合と同様に,索引ソートもレコード・ソートより高速であるが,レコード・アドレスを入力ファイルのレコードと対応させるプログラムを記述する必要がある。

9.3 照合順序の指定

文字は,照合順序 の順番に従って,ソートされます。文字データを含むファイルの場合は,/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 の文字順序では,文字は次の規則で並べられる。

  • 発音区別形式のすべての文字には,その文字の照合値が指定される(A',A",A` の場合 A で照合)。

  • 小文字には,それに相当する大文字の照合値が指定される(a では A,a" では A")。

  • 2 つの文字列が比較されて同じものと判断された場合,タイブレークが実行される。文字列が比較され,発音区別符号,無視される文字,実際には異なるにもかかわらず同じものとして扱われる文字などにより,両者の違いが検出される。2 つの文字列がそれでも同じものと判断される場合,文字の数値コードに基づいた比較が再度行われる。この最終的な比較では,小文字が大文字の前に並べられる。

国別文字セット(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 進の値で,文字を表現することもできる。

照合順序を定義するとき,次の規則を守らなければならない。

  • 文字を二重引用符("")で囲む。

  • それぞれの文字と一連の文字をコンマ(,)で区切り,リスト全体を括弧で囲む。

  • Sort 操作,Merge 操作の文字キーで使用するすべての文字に照合値を付ける。照合値の付いていない文字は,FOLD オプションまたは MODIFICATION オプションが指定されていない限り無視される。

  • 文字を複数回定義しないようにする。

  • 空文字を指定するとき,二重引用符("")を使用しないようにする。二重引用符ではなく,%X0 などの基数演算子を使用する。

  • 二重引用符を指定するときは,別の二重引用符で囲む("" "")か,基数演算子を使用する。

次の文字列は,二重文字 LL が L と M の間の単一文字として照合される照合順序を定義する。

("A"-"L","LL","M"-"Z")

注意

DEC で定義している照合順序を使用して,ファイルをソートまたはマージするときには注意が必要です。ほとんどのプログラミング言語のシーケンス・チェック・プロシージャは,数字を比較します。DEC で定義している照合順序は,グラフィック文字を表すコードを比較するのではなく,実際のグラフィック文字を比較するため,通常のシーケンス・チェックは正しく動作しません。

次の例は,指定ファイルで使用するために,ユーザ定義照合順序を作成する方法を示しています。指定ファイルについての詳細は, 第 9.7 節 を参照してください。


  1. (/COLLATING_SEQUENCE=(SEQUENCE=ASCII,IGNORE=("-"," "))
    


    このように,/COLLATING_SEQUENCE 修飾子に IGNORE オプションを指定した場合,次のフィールドが比較されるとき同じものとして扱われ,タイブレークになります。


           252-3412 
           252 3412 
           2523412 
    


  2. /COLLATING_SEQUENCE=(SEQUENCE=("A"-"L","LL","M"-"R","RR","S"-"Z"))
    


    この /COLLATING_SEQUENCE 修飾子は,二重文字 LL が L と M の間の単一文字として照合され,二重文字 RR が R と S の間の単一文字として照合される順序を定義します。このような定義がなければ,これらの二重文字は,通常のアルファベット順と同様になります。省略時の場合,このユーザ定義順序によって,小文字の a から z のような,他の文字が定義されることはありません。

9.4 バッチ・ジョブによるソートの実行

バッチ・ジョブとは,現在のセッションとは独立して実行するプログラムや 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 


前へ 次へ 目次 索引