日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 章:OpenVMS オペレーティング・システムの概要
第 2 章:DCL を使用したシステムとの会話
第 3 章:ファイル情報の格納
第 4 章:ディレクトリ・ファイルの編成
第 5 章:拡張ファイル指定
第 6 章:ディスクとテープ・ドライブの使用方法
第 7 章:Mail を使用して他のユーザと通信する
第 8 章:EVE エディタによるテキスト・ファイルの編集
第 9 章:ファイルのソートとマージ
第 10 章:資源へのアクセスの制御
第 11 章:デバイスとファイルの論理名定義
第 12 章:シンボル,コマンド,式の定義
第 13 章:コマンド・プロシージャの概要
第 14 章:DCL での拡張プログラミング
第 15 章:レキシカル関数を使用しての情報の取得と処理
第 16 章:プロセスとバッチ・ジョブ
付録 A :文字セット
付録 B :コマンド・プロシージャの例
用語集
索引
PDF
OpenVMS ホーム
OpenVMS

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


目次 索引



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 昇順および降順キーによるソート結果




省略時の設定では,Sort/Merge は同一キー・フィールドでレコードを保持しますが,それらのレコードを,入力ファイル中で現れた順序と同じ順序で保持するとは限りません。このようなレコードが存在すると思われる場合には,次の修飾子のいずれかを使用してその扱い方を指定することができます。

  • /STABLE
    同じキーを持つレコードを入力順序で残す。複数の入力ファイルをソートするときにこの修飾子を使用すると,同じキーを持つレコードが最初のファイルにあれば, 2 番目のファイルの前に並べられることになる。 2 番目以降についても同様の方法で処理される。

  • /NODUPLICATES
    1 つを残し,他の重複レコードをすべて排除する。そのまま残す重複レコードを指定する場合,プログラム・レベルで Sort を起動し,同一キー・ルーチンを指定する。

/STABLE 修飾子と /NODUPLICATES 修飾子は互換性がないため,同一コマンド行で両方の修飾子を指定することはできません。

次の例では,アカウント番号が重複するレコードは,ファイル EMPLOYEE.LST から削除されます。

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

図 9-7 はこのソート操作の結果を示しています。

図 9-7 同じキーを持つ場合のソート結果




文字データ以外の項目を含むレコードをソートする場合は,それぞれのキーでデータ型を指定します。また,比較する項目が2バイト以上占有することもあるため,開始位置とサイズを注意深く計算するようにします。

20 個の文字の後に,F_floating 形式の浮動小数を 3 つ含むファイルをソートする場合,位置は次のようになります。

  • 文字データは,1 から 20 までの位置を占有する (20 文字 )。

  • 最初の F 浮動小数は,21 から 24 までの位置を占有する。

  • 2 番目の F 浮動小数は,25 から 28 までの位置を占有する。

  • 3 番目の F 浮動小数は,29 から 32 までの位置を占有する。

3 番目の浮動小数でファイルをソートするときは,キー・フィールドを次のように指定します。

$ SORT/KEY=(POSITION:29,F_FLOATING) STATS.RAW STATS.SOR

浮動小数のサイズは 4 バイトに固定されているため,サイズを指定する必要はありません。

9.2.5 出力ファイルの編成

省略時の設定では,Sort は,最初の入力ファイルと同じファイル編成の出力ファイルを生成します。入力ファイルと異なる出力ファイル編成を指定するときは,Sort のコマンド行で出力ファイルを指定した後に次のいずれかの修飾子を指定します。

  • /FORMAT ( レコード形式 )
    この出力修飾子を使用すると,ファイル・レコードの形式,長さ,ブロック・サイズを定義できます。

  • /INDEXED_SEQUENTIAL
    この修飾子を使用すると,出力を 索引順編成ファイル 編成に定義できます。出力ファイル編成として索引順編成を指定する場合は,次の操作も行わなければなりません。

    • ソート操作を行う前に,出力ファイルとして使用する空のファイルを作成しておかなければなりません。これは,ソート操作では,既に存在する空の出力ファイルが必要だからです。

    • SORT コマンド行で,出力ファイル名の後に /OVERLAY 修飾子を指定しなければなりません。/OVERLAY 修飾子は,既存のファイルの上に入力ファイルのソートしたレコードをオーバレイするよう指定します。

  • /RELATIVE
    この修飾子を使用すると,出力を相対ファイル編成に定義できます。

  • /SEQUENTIAL
    この修飾子を使用すると,出力を順ファイル編成に定義できます。

次の例では,索引付き順編成ファイル 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 



9.4.2 入力レコードの包含

バッチ・ジョブには,入力レコードを含めておくことができます。これには,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 



9.5 ファイルのマージ

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 つの例外があります。

  • マージ操作にはプロセス (/PROCESS) を指定できない。

  • /CHECK_SEQUENCE 修飾子はマージ操作にだけ使用される。

次の例では,ファイル BYNAME1.LST と BYNAME2.LST は,従業員名によってすでに昇順にソートされています。ここに示したコマンドは,これらをマージします。

$ MERGE BYNAME1.LST,BYNAME2.LST BYNAME3.LST

出力ファイル BYNAME3.LST には,次の図に示すように, BYNAME1.LST と BYNAME2.LST の両方のファイルのすべてのレコードが含まれます。



目次 索引

© 2012 Hewlett-Packard Development Company, L.P.