[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

2 日本語ソート/マージ(SORT/MERGE)

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


2.1 機能概要

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

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

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

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

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

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

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

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

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

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

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

図 2-1 日本語ソートマージ処理フロー : (クリックで表示)

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


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


2.2.1 基本方式

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

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


2.2.2 国語辞典方式

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

  1. 五十音清音読み順

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

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

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

     カート

     カァト

     ガード

     ガート

     カアト

     カヽト

     カカト

     カガト

     ガアド

     ガヽド

     ガァト

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

     カアト

     カート

     カァト

     ガート

     ガァト

     ガアド

     ガード

     カカト

     カヽト

     カガト

     ガヽド


2.3 SORTおよびMERGEコマンド

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


2.3.1 日本語用機能

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


2.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


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

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

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


2.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号室 近藤佳明


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


2.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ビット)です。


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

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

    このプログラムは,ファイル" EXAM1.DAT "の最初の12バイト,つまり文字の振り 仮名フィールドを国語辞典順にソートし" 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);
    }
    


2.5 制限事項

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

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

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


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]