前へ | 次へ | 目次 | 索引 |
ソート操作の場合と同様に,入力ファイルに同じキー・フィールドを持つレコードが2 つ以上ある場合,レコード順序が入力ファイルと同じになるとはかぎりません。同じキーを持つレコードの入力順序をそのまま残すには, MERGEコマンド行に/STABLE修飾子を指定します。同じキーを持つレコードのうち 1 つだけを残すには, /NODUPLICATES 修飾子を指定します。
11.6 ターミナルからのレコードの入力
ソートまたはマージしようとするレコードは,ファイルに格納されている必要はありません。 SORT または MERGE コマンドを入力するときに,ターミナルからレコードを直接入力することができます。次の表に,その手順を示します。
手順 | 操作 |
---|---|
1 | SORT または MERGE コマンド行で,入力ファイルとして SYS$INPUT を指定する。
入力ファイル修飾子 /FORMAT を使用して,最も長いレコードのサイズ (バイト数) とそれに対応する入力ファイルのサイズ (ブロック数) を指定する。 |
2 | 後続の行にレコードを入力する。
Return を押して各レコードを終了させる。 |
3 | Ctrl/Z を押してファイルを終了させる。 |
次の例は,ソートしようとする入力レコードを,ターミナルから直接に入力する場合のソート操作を示しています。
$ SORT/KEY=(POSITION:8,SIZE:15) - _$ SYS$INPUT/FORMAT=(RECORD_SIZE:24,FILE_SIZE:10) BYNAME.LST BST 7828 MCMAHON JANE [Return] ADM 7933 ROSENBERG HARRY[Return] COM 8102 KNIGHT MARTHA[Return] ANS 8042 BENTLEY PETER[Return] BIO 7951 LOWELL FRANK[Return] [Ctrl/Z] |
このコマンド・シーケンスは,レコードをソートし,その結果を BYNAME.LST という名前のファイルに格納します。
11.7 Sort/Merge 指定ファイルの使用方法
Sort/Mergeでは,指定ファイル を使用してソート定義を格納しておき,必要があればさらに複雑なソート条件を指定することができます。 (高性能Sort/Mergeユーティリティでは,指定ファイルはサポートされていません。この機能は,OpenVMS Alphaの将来のリリースでサポートされる予定です。) 指定ファイルを作成するときは,任意の標準エディタやDCLのCREATEコマンドが使用できます。
Sort/Merge 指定ファイルを使用すると,次の操作を行えます。
指定ファイルを作成したら, /SPECIFICATION 修飾子を使用してファイル名を指定します。指定ファイルの省略時のファイル・タイプは.SRTです。
指定ファイル内では,各コマンドの先頭にスラッシュ (/) を付けます。コマンドが 2 行以上にわたる場合でも,行継続文字は必要ありません。
指定ファイルで使用する修飾子の多くは, Sort/Mergeコマンド行で使用する DCL 修飾子と似ています。ただし,これらの修飾子の構文は異なる場合があります。たとえば,DCLレベルの/KEY修飾子は,指定ファイルの/KEY修飾子とは構文が異なります。指定ファイルの修飾子については, 第 11.9.3 項 を参照してください。 |
コマンド行で指定する DCL コマンド修飾子は,指定ファイルの中の対応する項目を無効にします。たとえば,DCL コマンド行で /KEY 修飾子を指定しても, Sort/Merge は指定ファイルの中の /KEY 修飾子を無視します。
一般に,指定ファイルの中の修飾子はどのような順序で指定してもかまいません。ただし,次のような場合には,順序が重要になります。
/COLLATING_SEQUENCE 修飾子と同時に FOLD,MODIFICATION,および IGNORE キーワードを指定する場合には, MODIFICATION 句とIGNORE 句をすべて指定してから FOLD 句を指定します。 /COLLATING_SEQUENCE修飾子についての詳細は, 第 11.9.3 項 を参照してください。
指定ファイルの中にコメントを挿入するには,各コメント行の先頭に感嘆符 (!) を付けます。 DCL のコマンド行と異なり,指定ファイルは行を継続するときにハイフン (-) を必要としません。
例
! Specification file for sorting negative and positive data ! in ascending order ! /FIELD=(NAME=SIGN,POS:1,SIZ:1) (1) /FIELD=(NAME=AMT,POS:2,SIZ:4) (2) /CONDITION=(NAME=CHECK1, (3) TEST=(SIGN EQ "-")) /CONDITION=(NAME=CHECK2, (4) TEST=(SIGN EQ " ")) /INCLUDE=(CONDITION=CHECK1, (5) KEY=(AMT,DESCENDING), DATA=SIGN, DATA=AMT) /INCLUDE=(CONDITION=CHECK2, (6) KEY=(AMT,ASCENDING), DATA=SIGN, DATA=AMT) |
指定ファイルを確認する際には,次の点に注意してください。
図 11-8 は,上の指定ファイルの例を BALANCES.LIS という入力ファイルに使用した結果を示しています。
図 11-8 指定ファイルを使用した出力
/FIELD=(NAME=RECORD_TYPE,POS:1,SIZ:1) ! Record type, 1-byte /FIELD=(NAME=PRICE,POS:2,SIZ:8) ! Price, both files /FIELD=(NAME=TAXES,POS:10,SIZ:5) ! Taxes, both files /FIELD=(NAME=STYLE_A,POS:15,SIZ:10) ! Style, format A file /FIELD=(NAME=STYLE_B,POS:20,SIZ:10) ! Style, format B file /FIELD=(NAME=ZIP_A,POS:25,SIZ:5) ! Zip code, format A file /FIELD=(NAME=ZIP_B,POS:15,SIZ:5) ! Zip code, format B file /CONDITION=(NAME=FORMAT_A, ! Condition test, format A TEST=(RECORD_TYPE EQ "A")) /CONDITION=(NAME=FORMAT_B, ! Condition test, format B TEST=(RECORD_TYPE EQ "B")) /INCLUDE=(CONDITION=FORMAT_A, ! Output format, type A KEY=ZIP_A, DATA=PRICE, DATA=TAXES, DATA=STYLE_A, DATA=ZIP_A) /INCLUDE=(CONDITION=FORMAT_B, ! Output format, type B KEY=ZIP_B, DATA=PRICE, DATA=TAXES, DATA=STYLE_B, DATA=ZIP_B) |
この例では,不動産代理店の2つの支社から送られた2つの入力ファイルが,指定ファイルの指示に従ってソートされます。 1つ目のファイルのレコードは,最初の位置にAがついており,次の形式になっています。
|A|PRICE|TAXES|STYLE|ZIP| 1 2 10 15 25 |
2つ目のファイルのレコードは,最初の位置にBがつき, styleフィールドとzip codeフィールドが,次のように逆になっています。
|B|PRICE|TAXES|ZIP|STYLE| 1 2 10 15 20 |
これらの2つのファイルを,レコードAの形式のzip codeフィールドでソートするとき,最初に両方のレコードのフィールドを,/FIELD修飾子で定義します。その後,/CONDITION修飾子で, 2つのタイプのレコードを区別するためのテストを指定します。最後に/INCLUDE修飾子を指定して,タイプBのレコード形式をタイプAのレコード形式に変更して出力します。
/INCLUDE修飾子でキー・フィールドまたはデータ・フィールドのいずれかを指定する場合, /INCLUDE修飾子のSort操作で明示的にすべてのキー・フィールドとデータ・フィールドを指定する必要があります。
また,タイプAでもタイプBでもないレコードは,ソート時に排除されます。
/COLLATING_SEQUENCE=(SEQUENCE= ("AN","EB","AR","PR","AY","UN","UL", "UG","EP","CT","OV","EC","0"-"9"), MODIFICATION=("'"="19"), FOLD) |
この/COLLATING_SEQUENCE修飾子では,ユーザ定義順序を指定します。この指定により,それぞれの月に,日付順の固有の値が定義されます。たとえば,SEMINAR.DATというファイルを日付順に並べたい場合, SEMINAR.DATファイルは次のようになっています。
16 NOV 1983 Communication Skills 05 APR 1984 Coping with Alcoholism 11 Jan '84 How to Be Assertive 12 OCT 1983 Improving Productivity 15 MAR 1984 Living with Your Teenager 08 FEB 1984 Single Parenting 07 Dec '83 Stress --- Causes and Cures 14 SEP 1983 Time Management |
一次キーがyearフィールドで,二次キーがmonthフィールドです。 monthフィールドは数値ではありませんが,日付順に並べたいため,独自の照合順序を定義する必要があります。この場合,それぞれの月に固有のキー値を指定して,それぞれの月の2番目と3番目の文字を(日付順に)ソートすることにより,これを行います。
MODIFICATIONオプションでは,アポストロフィ(')が19と同等になるよう指定していますが,これによって,'83と1984が比較できるようになります。またFOLDオプションは,大文字と小文字が同等に扱われるよう指定します。
このSort操作の出力は,次のようになります。
14 SEP 1983 Time Management 12 OCT 1983 Improving Productivity 16 NOV 1983 Communication Skills 07 Dec '83 Stress --- Causes and Cures 11 Jan '84 How to Be Assertive 08 FEB 1984 Single Parenting 15 MAR 1984 Living with Your Teenager 05 APR 1984 Coping with Alcoholism |
ユーザ定義照合順序の他の例については,
第 11.3 節 を参照してください。
/FIELD=(NAME=AGENT,POSITION:20,SIZE:15) /CONDITION=(NAME=AGENCY, TEST=(AGENT EQ "Real-T Trust" OR AGENT EQ "Realty Trust")) /DATA=(IF AGENCY THEN "Realty Trust" ELSE AGENT) |
この例では,2つの不動産ファイルをソートします。 1つのファイルは,ある代理店がReal-T Trustと呼ぶもので,もう1つのファイルはRealty Trustと呼ばれます。 /CONDITION修飾子と/DATA修飾子により, Realty Trustのソート出力ファイルにAGENTフィールドがリストされることになります。
/FIELD=(NAME=ZIP,POSITION:60,SIZE:6) /CONDITION=(NAME=LOCATION, TEST=(ZIP EQ "01863")) /KEY=(IF LOCATION THEN 1 ELSE 2) |
この例では,郵便番号01863を持つすべてのレコードがソート出力ファイルの最初にリストされます。条件テストは,/FIELD修飾子で定義されているようにZIPフィールドで行われます。条件名はLOCATIONになっています。 /KEY修飾子にある値1と2は,条件を満たすレコードと条件を満たさないレコードの相対順序を表すものです。
/FIELD=(NAME=ZIP,POSITION:60,SIZE:6) /CONDITION=(NAME=LOCATION, TEST=(ZIP EQ "01863")) /DATA=(IF LOCATION THEN "NORTH CHELMSFORD" ELSE "Outside district") |
この例では,/CONDITION修飾子により,郵便番号01863についてテストが行われます。 /DATA修飾子は,テスト結果に従って, townフィールドの名前が出力レコードに追加されるよう指定します。
/FIELD=(NAME=FFLOAT,POS:1,SIZ:0,F_FLOATING) /CONDITION=(NAME=CFFLOAT,TEST=(FFLOAT GE 100)) /OMIT=(CONDITION=CFFLOAT) |
この例では,/FIELD修飾子でフィールドFFLOATがF_FLOATINGと定義されているため,数値100がF_FLOATINGデータ型とみなされます。
/FIELD=(NAME=AGENT,POSITION:1,SIZE:5) /FIELD=(NAME=ZIP,POSITION:6,SIZE:3) /FIELD=(NAME=STYLE,POSITION:10,SIZE:5) /FIELD=(NAME=CONDITION,POSITION:16,SIZE:9) /FIELD=(NAME=PRICE,POSITION:26,SIZE:5) /FIELD=(NAME=TAXES,POSITION:32,SIZE:5) /DATA=PRICE /DATA=" " /DATA=TAXES /DATA=" " /DATA=STYLE /DATA=" " /DATA=ZIP /DATA=" " /DATA=AGENT |
この/FIELD修飾子は,次の形式を持つ入力ファイルのレコードのフィールドを定義します。
AGENT ZIP STYLE CONDITION PRICE TAXES |
/DATA修飾子では,/FIELD修飾子で定義されているフィールド名を使用しますが,レコードを再フォーマットして,次の形式の出力レコードを作成します。
PRICE TAXES STYLE ZIP AGENT |
ソート操作またはマージ操作の効率は,ソート環境により,いくつかの方法で向上させることができます。 SORTコマンドまたはMERGEコマンドに/STATISTICS修飾子を使用すると,ソート環境の変数を表示できます。
この統計情報を調べてから,この後に説明する最適化オプションの使用を検討してみてください。
SORT コマンドまたは MERGE コマンドに /STATISTICS 修飾子を指定すると,次のような出力が表示されます。
$ SORT/STATISTICS PAGEANT.LIS DOCUMENT.LIS OpenVMS Sort/Merge Statistics Records read: 3 (1) Input record length: 26 Records sorted: 3 Internal length: 28 Records output: 3 Output record length: 26 Working set extent: 16384 (2) Sort tree size: 42 Virtual memory: 392 Number of initial runs: 0 Direct I/O: 10 Maximum merge order: 0 Buffered I/O: 11 Number of merge passes: 0 Page faults: 158 (3) Work file allocation: 0 (4) Elapsed time: 00:00:00.54 Elapsed CPU: 00:00:00.03 (5) |
この統計表示から次のことが分かります。
Sortでは,内部でデータをソートするときに使用する,レコード,タグ,アドレス,索引の4つのプロセスを定義します。 (高性能Sort/Mergeユーティリティでは,レコード・プロセスのみがサポートされます。タグ,アドレス,索引の各プロセスについては, OpenVMS Alphaの将来のリリースでサポートされる予定です。) RECORDが省略時のプロセスになります。指定するプロセスのタイプによっては,必要な記憶域の量と同様に, Sort操作の効率も変わることがあります。その他のソート・プロセスについての詳細は, 第 11.2.6 項 を参照してください。
どのタイプのソート方法を使用するかは,次の点を考慮して決定してください。
あるファイルのレコードを様々な目的で並べ換える必要がある場合には,アドレス・ソートまたは索引順編成ソートによって生成された複数の出力ファイルを格納する。望ましい順序で並べられたメイン・ファイルの中のレコードにアクセスするには,この出力ファイルを使用する。
タグ・ソートは,レコード・ソートに比べて,使用する一時格納領域が少なくてすむ。レコード・ソートは,ソート中はレコードに手を加えないので,ファイルが大きい場合には使用する作業領域が多くなる。アドレス・ソートと索引順編成ソートは,一時格納領域をほとんど使用しない。
カード,磁気テープ,ディスクから入力を受け付けるプロセスは,レコード・ソートだけである。タグ・ソートとレコード・ソートの結果はどの出力デバイスにも出力できるが,アドレス・ソートと索引順編成ソートの結果は,バイナリ・データを受け付けるデバイスに出力しなければならない。
ソートしたレコードを操作の最中に検索する予定がある場合,通常,レコード・ソートが最も処理速度が速くなる。それ以外の場合には,アドレス・ソートと索引順編成ソートの処理速度が速くなる。
前へ | 次へ | 目次 | 索引 |