日本語 Compaq OpenVMS
日本語ユーティリティ
利用者の手引き


前へ 次へ 目次 索引



第 3 章
日本語ソート/マージ (SORT/MERGE)

この章では,日本語ソート/マージ (SORT/MERGE) について説明します。

3.1 機能概要

日本語ソート/マージは漢字が持つ属性(音読み,訓読み,部首,総画数)および振り仮名フィールドによる国語辞典方式にしたがってソート/マージ処理を行うものです。

本書は Compaq OpenVMS オペレーティング・システムの SORT/MERGE のマニュアルを読んでいることを前提にして記述されていますので,必要に応じて次のマニュアルを参照してください。

Compaq OpenVMS 標準版SORT/MERGEは次の日本語用機能も認識するようになっています。

  1. 音読み順ソート/マージ

  2. 訓読み順ソート/マージ

  3. 部首コード順ソート/マージ

  4. 総画数順ソート/マージ

  5. 国語辞典方式ソート/マージ全角振り仮名(ひらがなおよびカタカナ)

  6. 国語辞典方式ソート/マージ半角振り仮名(カタカナ)

  7. JIS コード・テーブル順ソート/マージ

これらの機能は,OpenVMS の SORT/MERGE の漢字属性内部辞書を使うことにより行われます。

図 3-1 日本語ソート /マージ処理フロー


つまり日本語ソート/マージは,標準版SORT/MERGEに日本語用のモジュールを追加したものであり,標準版SORT/MERGEの DCL コマンドである SORT,MERGE により,日本語データも日本語以外のデータと同じように処理できるようになっています。

3.2 日本語ソート機能の方式

3.2.1 基本方式

KEY フィールドによって指定されたフィールドを漢字の音読み,訓読み,部首コード,総画数あるいは,JIS コード・テーブルの順に並べかえることができます。

音読み 漢字属性辞書の第1音読みによる。
訓読み 漢字属性辞書の第1訓読みによる。
部首コード JIS 部首コードによる。
総画数 画数による。
JIS コード・テーブル JIS X 0208 コード・テーブルによる。

3.2.2 国語辞典方式

ユーザが指定した全角(ひらがなか,カタカナ)または半角(カタカナ)の振り仮名フィールドを次の照合順序によって並べかえることができます。

  1. 五十音清音読み順

  2. 清音,濁音,半濁音の順

  3. 直音,小字(よう音および促音)の順

また,繰り返し記号は,1文字前の文字を使い,長音符号については1文字前の文字の母音が使われます。
したがって


 カート 
 
 カァト 
 
 ガード 
 
 ガート 
 
 カアト 
 
 カヽト 
 
 カカト 
 
 カガト 
 
 ガアド 
 
 ガヽド 
 
 ガァト 

を / KEY = (POSITION:1, SIZE:6, KOKUGO) でソートすると,次のようになります。


 カアト 
 
 カート 
 
 カァト 
 
 ガート 
 
 ガァト 
 
 ガアド 
 
 ガード 
 
 カカト 
 
 カヽト 
 
 カガト 
 
 ガヽド 

3.3 SORT および MERGE コマンド

この節では,SORT と MERGE コマンドの使用方法および日本語ソート/マージ・サブルーチンについて説明します。

3.3.1 日本語用機能

KEY 修飾子に日本語用として次のものを追加しています。

3.3.2 SORT/MERGE コマンドの使用例

以下に使用例を示します。

また,日本語フィールドの場合には,DCLより同時に複数のソート方式を指定することが可能です。たとえば次のように指定できます。


SORT/KEY=(POSITION:30, SIZE:6, SOKAKU, ONYOMI, JISCODE) IN.DAT OUT.DAT

これは次の指定方法と同等です。


 
SORT/KEY=(POSITION:30, SIZE:6, SOKAKU) - 
    /KEY=(POSITION:30, SIZE:6, ONYOMI) - 
    /KEY=(POSITION:30, SIZE:6, JISCODE) IN.DAT OUT.DAT 
 

3.3.3 仕様ファイル (Specification file) 中の使用方法

仕様ファイルの中でも,日本語データ・タイプを使用できます。標準版のドキュメントであげてあるデータ・タイプ(『 OpenVMS ユーザーズ・マニュアル』を参照)以外に,次の疑似データ・タイプを使用できます。

ONYOMI (音読み)
KUNYOMI (訓読み)
BUSHU (部首コード)
SOKAKU (総画数)
KOKUGO (国語辞典方式全角振り仮名)
KANA8BIT (国語辞典方式半角振り仮名)
JISCODE (JIS コード・テーブル)

3.3.4 仕様ファイル中での使用例

以下に使用例を示します。


 
$ SORT/SPECIFICATION=SPEC.SRT DATA.DAT OUT.DAT 
 

SPEC.SRT は以下のとおりです。


 
/FIELD=(NAME=KASHIRA,  POSITION:1,  SIZE:2,  SOKAKU)     ------(1) 
/FIELD=(NAME=NAMAE,  POSITION:1,  SIZE:20,  BUSHU)       ------(2) 
/FIELD=(NAME=JUSHO,  POSITION:21,  SIZE:56)              ------(3) 
/KEY=NAMAE                                               ------(4) 
/DATA=JUSHO                                              ------(5) 
/DATA=" "                                                ------(6) 
/DATA=NAMAE                                              ------(7) 
/CONDITION=(NAME=LEIWA,  TEST=(KASHIRA LE "岩"))         ------(8) 
/INCLUDE=(CONDITION=LEIWA)                               ------(9) 
 

(1), (2), (3) は "KASHIRA","NAMAE","JUSHO" という3つのフィールドを定義します。 (4)によって,"NAMAE" フィールドを使って1バイト目から 20 バイトを部首順にソートすることが指定されます。この例では,全部のレコードを出力するのではなく, (8), (9) で選択したレコードのみを出力します。つまり,"NAMAE" フィールドの先頭の文字の総画数が, "岩" の総画数 8 と同じか,または少ないレコードのデータだけを出力するということです。出力フォーマットは (5),(6),(7) によって指定されています。

以下の DATA-1 が DATA.DAT の場合, DATA-2 が結果として OUT.DAT に出力されます。

<DATA-1>

岩田誠 東京都世田谷区桜上水5丁目3−5
山本武則 東京都杉並区下高井戸1丁目12−35
白鹿正通 東京都葛飾区亀有2丁目24−10 清風荘203号室
米沢佳美 千葉県千葉市板倉町1丁目2−5
藤井久継 東京都練馬区豊玉中2丁目25 JBLコーポ102号室
飯田秀一 東京都世田谷区代田1丁目2−35 豊中マンション801号
南野陽子 東京都新宿区馬場下町3丁目1−1
近藤佳明 東京都杉並区大宮1丁目3−13 壬生川コーポ304号室
波頭陽一 東京都葛飾区柴又5丁目10−22
田窪健三 東京都杉並区永福3丁目32−14

<DATA-2>

東京都杉並区下高井戸1丁目12−35 山本武則
東京都葛飾区柴又5丁目10−22 波頭陽一
東京都杉並区永福3丁目32−14 田窪健三
東京都葛飾区亀有2丁目24−10 清風荘203号室 白鹿正通
東京都世田谷区桜上水5丁目3−5 岩田誠
千葉県千葉市板倉町1丁目2−5 米沢佳美
東京都杉並区大宮1丁目3−13 壬生川コーポ3O4号室 近藤佳明

3.4 日本語ソート/マージ・サブルーチン

3.4.1 日本語ソート/マージ・サブルーチンの機能

標準版SORT/MERGE は以下のサブルーチンを提供しています。

  1. SOR$PASS_FILES

  2. SOR$BEGIN_SORT

  3. SOR$BEGIN_MERGE

  4. SOR$SORT_MERGE

  5. SOR$END_SORT

  6. SOR$RELEASE_REC

  7. SOR$RETURN_REC

  8. SOR$STAT

  9. SOR$SPEC_FILE

これらのサブルーチンの使い方やパラメータなどについては,『 OpenVMS Utility Routines Manual 』または『 OpenVMS Programming Enviroment Manual 』を参照してください。日本語ソート/マージでは,標準版 SORT/MERGE サブルーチンの機能に加えて次の日本語機能が追加されています。

擬似データ・タイプとして以下のコードが使用できます。

SOR$K_SEQ_ONYOMI 音読み
SOR$K_SEQ_KUNYOMI 訓読み
SOR$K_SEQ_BUSHU 部首コード
SOR$K_SEQ_SOKAKU 総画数
SOR$K_SEQ_KOKUGO 国語辞典方式全角振り仮名
SOR$K_SEQ_KANA8BIT 国語辞典方式半角振り仮名
SOR$K_SEQ_JISCODE JIS コード・テーブル

これらのコードは SYS$LIBRARY:IMAGELIB.OLB に含まれているので,特別な指定なしにリンク時に自動的にセットされます。長さはワード( 16 ビット)です。

3.4.2 ソート/マージ・サブルーチンの使用例

  1. FORTRAN 言語で使用した例を以下に示します。

    このプログラムは,ファイル " EXAM1.DAT " の最初の 12 バイト,つまり6文字の振り仮名フィールドを国語辞典順にソートし " EXAM1OUT.DAT " に出力します。


     
          IMPLICIT         INTEGER*4       (A-Z) 
          INTEGER*2        KEYBUFF(5) 
          CHARACTER*9      IN_FILE 
          CHARACTER*12     OUT_FILE 
          EXTERNAL SOR$K_SEQ_KOKUGO 
          DATA    IN_FILE,  OUT_FILE        /'EXAM1.DAT', 'EXAM1OUT.DAT'/
          KEYBUFF(1) = 1                       ! Number of KEY 
          KEYBUFF(2) = %LOC(SOR$K_SEQ_KOKUGO)  ! Kokugo dictionary sequence 
          KEYBUFF(3) = 0                       ! Ascending sort 
          KEYBUFF(4) = 0                       ! Key offset 
          KEYBUFF(5) = 12                      ! Size in bytes 
     
          STATUS = SOR$PASS_FILES(IN_FILE,  OUT_FILE) 
          IF (.NOT. STATUS)       GOTO 10 
     
          STATUS = SOR$BEGIN_SORT(KEYBUFF) 
          IF (.NOT. STATUS)       GOTO 10 
     
          STATUS = SOR$SORT_MERGE( ) 
          IF (.NOT. STATUS)       GOTO 10 
     
          STATUS = SOR$END_SORT( ) 
          IF (.NOT. STATUS)       GOTO 10 
     
          STOP    'SUCCESS' 
     
    10    CONTINUE 
          STOP    'FAILURE' 
     
          END 
     
    

  2. DCL よりFORTRAN 言語で使用した例を以下に示します。

    このプログラムは,入力はファイル渡し,出力はレコード渡しを使っています。またキーは2つあり,第1キーは総画数で昇順,第2キーは部首コードで降順となっています。


     
    C     Define external functions and data and initialize 
     
          IMPLICIT  INTEGER*4     (A-Z) 
          CHARACTER*80 RECBUF 
          CHARACTER*9  INPUTNAME          !Input file name 
          INTEGER*2 KEYBUF(9)             !Key definition buffer 
          EXTERNAL SS$_ENDOFFILE 
          EXTERNAL SOR$GK_RECORD 
          EXTERNAL SOR$K_SEQ_BUSHU        !Bushu  collating sequence 
          EXTERNAL SOR$K_SEQ_SOKAKU       !Sokaku collating sequence 
     
          DATA INPUTNAME/'EXAM2.DAT'/ 
          KEYBUF(1) = 2 
          KEYBUF(2) = %LOC(SOR$K_SEQ_SOKAKU)      !Primary key SOKAKU 
          KEYBUF(3) = 0                           !Ascending 
          KEYBUF(4) = 0                           !offset 0 
          KEYBUF(5) = 10                          !size  10 
          KEYBUF(6) = %LOC(SOR$K_SEQ_BUSHU)       !Secondary key BUSHU 
          KEYBUF(7) = 1                           !Descending 
          KEYBUF(8) = 0                           !offset  0 
          KEYBUF(9) = 10                          !size   10 
          SRTTYPE = %LOC(SOR$GK_RECORD) 
     
    C     Pass SORT the file names. 
     
          ISTATUS = SOR$PASS_FILES(INPUTNAME) 
          IF (.NOT. ISTATUS) GOTO 10 
     
    C     Initialize the work areas and keys. 
     
          ISTATUS = SOR$BEGIN_SORT(KEYBUF, , , , , , SRTTYPE, %REF(3))
          IF (.NOT. ISTATUS) GOTO 10 
     
    C     Sort the records. 
     
          ISTATUS = SOR$SORT_MERGE( ) 
          IF (.NOT. ISTATUS) GOTO 10 
     
    C     Now retrieve the individual records and display them. 
     
    5     ISTATUS = SOR$RETURN_REC(RECBUF) 
          IF (.NOT. ISTATUS) GOTO 6 
          ISTATUS = LIB$PUT_OUTPUT(RECBUF) 
          GOTO 5 
     
    6     IF (ISTATUS .EQ. %LOC(SS$_ENDOFFILE)) GOTO 7 
          GOTO 10 
     
    C     Clean up the work areas and files. 
     
    7     ISTATUS = SOR$END_SORT() 
          IF (.NOT. ISTATUS) GOTO 10 
     
          STOP 'SORT SUCCESSFUL' 
     
    10    STOP 'SORT UNSUCCESSFUL' 
     
          END 
     
    

  3. C言語で使用した例を以下に示します。

    このプログラムは,2つの入力ファイルのマージを行います。キーはオフセット5より 6バイトつまり漢字3文字で入力ファイルが正確に順番どおりになっているかをチェックします。


    #include <stsdef.h> 
     
    struct DESCRIPTOR   { 
                          int  leng ; 
                          char *ptr ; 
    }; 
    globalvalue SOR$K_SEQ_ONYOMI, 
                SOR$M_SEQ_CHECK; 
    main(){ 
     
       char    infile1[] = "EXAM31.DAT"  , 
               infile2[] = "EXAM32.DAT"  , 
               outfile[]=  "EXAM3OUT.DAT" ; 
       struct DESCRIPTOR 
               inptr1 ={strlen(infile1) , infile1}, 
               inptr2 ={strlen(infile2) , infile2}, 
               outptr ={strlen(outfile) , outfile}; 
     
       short   lrl,  key[5] ; 
       int  status, option; 
     
    /* initialize the key */ 
     
       key[0] = 1 ;                /* key no. */ 
       key[1] = SOR$K_SEQ_ONYOMI ; /* onyomi  */ 
       key[2] = 0 ;                /* ascend  */ 
       key[3] = 5 ;                /* offset  */ 
       key[4] = 6 ;                /* size    */ 
       lrl    = 131;               /* LRL     */ 
       option = SOR$M_SEQ_CHECK;   /* check input sequence */ 
     
     
    /* merge the files */ 
       if (!((status=sor$pass_files(&inptr1, &outptr)) & STS$M_SUCCESS)) 
          lib$stop(status); 
     
       if (!((status=sor$pass_files(&inptr2)) & STS$M_SUCCESS)) 
          lib$stop(status); 
     
       if (!((status=sor$begin_merge(key, &lrl, &option)) & STS$M_SUCCESS)) 
          lib$stop(status); 
     
       if (!((status=sor$end_sort()) & STS$M_SUCCESS)) 
          lib$stop(status); 
    } 
     
    

3.5 制限事項

日本語ソート/マージには次の制限事項があります。

  1. SORT/MERGEコマンドの SIZE 修飾子はバイト単位で指定できます。ただし, 2バイトの日本語データ・タイプを扱うとき,SIZE修飾子で指定する値は 2の倍数でなければなりません。もし,SIZEの値が奇数である場合は,SOR$_ODD_LEN エラーが発生します。

  2. ソートおよびマージ・キーとして用いられる文字列の中に漢字ソート辞書にない文字が含まれている場合,その文字のソート値は 0 として扱われます。


前へ 次へ 目次 索引