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


前へ 次へ 目次 索引


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

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


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

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


9.5.1 ソート済みのファイル

特定のキーを使用してソートしたファイルをマージする場合は,MERGEコマンド行の/KEY修飾子で同じキーを指定する必要があります。

キーを指定しない場合は,Merge は 第 9.2 節 で説明している省略時設定のキーを使用します。

たとえば,ファイルBILLING1.LST と BILLING4.LST がアカウント番号によってソート済み(/KEY=POSITION:5,SIZE:4,DECIMAL)であるとします。この 2 つのファイルを出力ファイル MAILING.LST にマージするには,次のコマンド行を入力します。


$ MERGE/KEY=(POSITION:5,SIZE:4,DECIMAL)-
_$ BILLING1.LST,BILLING4.LST MAILING.LST

マージ結果は次のとおりです。


マージしたいファイルがソート順になっていることを知っている場合は,/NOCHECK_SEQUENCE 修飾子を指定することにより,順序チェックを省略することができます。

9.5.2 同一キー・フィールドによるレコードのマージ

ソート操作の場合と同様に,入力ファイルに同じキー・フィールドを持つレコードが 2 つ以上ある場合,レコード順序が入力ファイルと同じになるとはかぎりません。同じキーを持つレコードの入力順序をそのまま残すには,MERGE コマンド行に /STABLE 修飾子を指定します。同じキーを持つレコードのうち 1 つだけを残すには,/NODUPLICATES 修飾子を指定します。

9.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 
ADM 7933 ROSENBERG HARRY 
COM 8102 KNIGHT MARTHA 
ANS 8042 BENTLEY PETER 
BIO 7951 LOWELL FRANK 
 

このコマンド・シーケンスは,レコードをソートし,その結果を BYNAME.LST という名前のファイルに格納します。

9.7 Sort/Merge 指定ファイルの使用方法

Sort/Merge では,指定ファイル を使用してソート定義を格納しておき,必要があればさらに複雑なソート条件を指定することができます。(高性能 Sort/Merge ユーティリティでは,指定ファイルはサポートされていません。この機能は,OpenVMS Alpha の将来のリリースでサポートされる予定です。)指定ファイルを作成するときは,任意の標準エディタやDCLのCREATEコマンドが使用できます。

Sort/Merge 指定ファイルを使用すると,次の操作を行えます。

指定ファイルを作成したら,/SPECIFICATION 修飾子を使用してファイル名を指定します。指定ファイルの省略時のファイル・タイプは .SRT です。

指定ファイル内では,各コマンドの先頭にスラッシュ(/)を付けます。コマンドが 2 行以上にわたる場合でも,行継続文字は必要ありません。

注意

指定ファイルで使用する修飾子の多くは,Sort/Merge コマンド行で使用する DCL 修飾子と似ています。ただし,これらの修飾子の構文は異なる場合があります。たとえば,DCL レベルの /KEY 修飾子は,指定ファイルの /KEY 修飾子とは構文が異なります。指定ファイルの修飾子については,第 9.9.3 項 を参照してください。

コマンド行で指定する DCL コマンド修飾子は,指定ファイルの中の対応する項目を無効にします。たとえば,DCL コマンド行で /KEY 修飾子を指定しても,Sort/Merge は指定ファイルの中の /KEY 修飾子を無視します。

一般に,指定ファイルの中の修飾子はどのような順序で指定してもかまいません。ただし,次のような場合には,順序が重要になります。

/COLLATING_SEQUENCE 修飾子と同時に FOLD,MODIFICATION,および IGNORE キーワードを指定する場合には,MODIFICATION 句とIGNORE 句をすべて指定してから FOLD 句を指定します。/COLLATING_SEQUENCE 修飾子についての詳細は,第 9.9.3 項 を参照してください。

指定ファイルの中にコメントを挿入するには,各コメント行の先頭に感嘆符(!)を付けます。DCL のコマンド行と異なり,指定ファイルは行を継続するときにハイフン(-)を必要としません。


  1. 次の例は,負と正のデータを昇順にソートするための指定ファイルです。


    ! 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)
    


    指定ファイルを確認する際には,次の点に注意してください。

    1. このコマンド行は,レコードの第 1 バイトで始まる,長さ 1 バイトのフィールドを定義し,このフィールドに名前 SIGN を割り当てる。

    2. このコマンド行は,レコードの第 2 バイトで始まる,長さ 4 バイトのフィールドを定義し,このフィールドに名前 AMT を割り当てる。

    3. これは条件文である。SIGN バイトに負符号(-)がある場合,条件 CHECK1 を満たす。

    4. これは条件文である。SIGN バイトがブランクの場合,条件 CHECK2 を満たす。

    5. 条件 CHECK1 を満たす場合,レコードを降順にソートする。

    6. 条件 CHECK2 を満たす場合,レコードを昇順にソートする。


    図 9-8 は,上の指定ファイルの例を BALANCES.LIS という入力ファイルに使用した結果を示しています。

    図 9-8 指定ファイルを使用した出力



  2. /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でもないレコードは,ソート時に排除されます。


  3. /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 
    


    ユーザ定義照合順序の他の例については,第 9.3 節 を参照してください。


  4. /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 フィールドがリストされることになります。


  5. /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 は,条件を満たすレコードと条件を満たさないレコードの相対順序を表すものです。


  6. /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 フィールドの名前が出力レコードに追加されるよう指定します。


  7. /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 データ型とみなされます。


  8. /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 
    


前へ 次へ 目次 索引