質問箱 No.63: 読みを入力するだけでフリガナと漢字両方を書込みたい

      ◆ 質問箱 No.63 質問者:  罍 昭夫  1997年10月%nbsp;189号 P.19
          ◆ 質問箱 目次へ
No.63-3 読みを入力するだけでフリガナと漢字両方を書込みたい 回答者
  入川 精二
1997年12月
191号 P.23
   ◆ No.63(1997年 10月号)の回答-03
《《はじめに》》
    これはもうどう考えてもFORM入力のテーマだと思うのです。私の名刺入力システムでかなりしつこくチェックを掛けていても23行で済ませています。
    質問者の『どうしてもオートプログラムで』というコダワリに従って、難解なプログラムを書いてしまいました。ご覧の通り100行を越すプログラムで、しかも殆どチェックなしです。作っては見たものの、決してお奨めするものではありません。オートでもこの程度は出来るという見本です。

《《準備するもの》》
   このプログラムを実行するためには‘ATOK’とか‘IME’といった日本語変換システムの他に"姓辞書" [表1]と"名辞書"を用意しなければなりません。理由は2つあります。第一にPIPSのオートで‘ATOK’などによる変換処理が実行できないことです(と私は思っています)。第2の理由は、これらの日本語変換システムが持っている辞書は、日本人の氏名に関しては至って貧弱なことです。これに我慢できなかったので自分で"姓辞書"と"名辞書"を作りました。まだ十分ではありませんが、‘ATOK’などよりはるかにマシです。"姓辞書"・"名辞書"の他に、"氏名入力"の表と同音異字の姓や名を書込む"氏名検索"の表を準備します。"氏名検索"は‘No.’の列を「@参照列」にしておきます。
《《このプログラムの特徴》》
   通常の処理では (1) 姓カナ入力⇒⇒ (2) 姓漢字変換 ⇒⇒ (3) 名カナ入力 ⇒⇒ (4) 名漢字変換  という手順になりますが、このプログラムでは、(1) 姓名カナ入力 ⇒⇒(2) 姓漢字変換 ⇒⇒ (3) 名漢字変換  というプロセスになります。   (1) では、姓と名のカナを半角スペースを空けて入力します。例えばモトヤマ ヨシコ  というように(元山さんゴメンナサイ)後は選択するだけです。
   また、変換の過程で該当する漢字データが21以上あると、画面に一度に表示できないので‘+’‘-’でスクロールするようにしてあります。
   ちなみに‘コウジ’と読む名前は139通りあります。

《《プログラムの説明》》
  •  24行: ‘姓辞書’バインダーは‘JISHO’キャビネットにあって、‘姓カナ’列に‘SEI’というインデックスが掛けてあります。同様に‘名辞書’バインダーも‘JISHO’キャビネットにあって、‘名カナ’列に‘MEI’というインデックスが掛けてあります。両インデックスをオープンしておきます。
  • 25行: 画面の枠内を全てオート専用画面にします。
  • 26行: 入力表の「氏名入力」をメインバッファに呼び出します。
  • 29行: ここから姓名の読みを半角カタカナで、かつ姓と名の間に半角1桁のスペースをいれて入力します。
  • 34行: そのまま入力表の「カナ」の欄に書込みます。
  • 36行〜47行: 姓名のカナから「姓のカナ」を抽出します。「姓のカナ」に対応する漢字をインデックス検索して、サブバッファの「氏名検索表」に書込みます。同時に番号も書き込みます。
  • 48行: 検索した表を画面に表示するため、サブプログラム‘DISP’(83行)に飛びます。
  • 84〜95行: 画面に20データずつ表示させるプログラムです。
  • 97〜111行: 漢字は番号で選択します。画面をスクロールしたいときは‘+’‘-’で操作します。
  • 111〜114行: 選択された漢字を変数(V22)に格納し、画面に表示し、右端に表示されている検索表を消去して、メインプログラムに戻ります。
       サブプログラムは「姓」と「名」で共通に使います。
  • 49行: 共通に使っている変数(V22)の内容を「姓」の受皿となる変数(V12)に取り込みます。
  • 51〜66行: 「姓」と同様のプロセスで「名」についても漢字を特定し、変数(V13)に取り込みます。
  • 68〜71行: 姓の漢字と名の漢字を合体して、画面に表示するとともに入力表の漢字の欄に書き込みます。
       これで1ラウンドが終わりました。
  • 72〜80行: さらに入力を続けるかどうかを確認し、‘N’ならオート専用画面をクローズしてプログラムを終了します。
       ‘Y’なら28行の $入力 に戻ります。 □
 1 <NAME>                【 Ver.01 Rev.01X 19971028 】
 2 **************************************************************************/
 3 /*       V1        姓名のカナ                      */
 4 /*       V2        姓のカナ                       */
 5 /*       V3        名のカナ                       */
 6 /*       V4        検索した姓または名の漢字               */
 7 /*       V5        表示のための文字("姓"か"名")             */
 8 /*       V11       姓漢字と名漢字を合成した文字列(目的の姓名漢字)    */
 9 /*       V12       確定した姓(漢字)                   */
 10 /*       V13       確定した名(漢字)                    */
 11 /*       V20       INPUT文の受け皿(姓または名選択の番号)         */
 12 /*       V22       検索した姓または名から選択した漢字          */
 13 /*       V30       INPUT文の受け皿(Y or N)                */
 14 /*       V33       表示のための検索データの1行の文字列         */
 15 /*       X1        検索データ(サブバッファ)の行番号              */
 16 /*       X21       入力表の行番号                     */
 17 /*       X30       メッセージ表示の行番号                  */
 18 /*       X31       辞書から検索したデータの番号              */
 19 /*       X32       検索データ表示の行番号                 */
 20 /*       X33       表示のための検索データの行番号の初期値         */
 21 /*       X34       姓または名の検索データ(サブバッファ)の行番号         */
 22 /*************************************************************************/
 23
 24          IUSE "JISHO:SEI";    IUSE "JISHO:MEI";
 25          DISP OPEN(1,2,80,ENV(6)-3);
 26 $SS:     G;氏名入力/1;
 27          LET X21=H;                                  /* 入力表の行番号 */
 28 $入力:   LET X30=4;                          /* メッセージ表示の行番号 */
 29 $入力2:  DISP COLOR(C),[05,X30],"姓名(半角カナ)は?";
 30           INPUT [25,X30],V1,U(XXXXXXXXXXXXXX/AF/CY/P/);  /* 姓名のカナ */
 31 $CHK01:  IF ERR(0)=55 THEN GOTO $END;                /* [ESC]が押された */
 32 $CHK02:  IF INSTR(2,V1," ")=0 THEN GOTO $入力2;/* 区切りのスペースがない*/
 33           LET X30=X30+2;
 34           LET [X21,@カナ ]=V1;                     /* 入力表に書込む */
 35 /*## 姓の辞書検索 ##*/
 36 $姓:      LET V2=LEFT$(V1,INSTR(1,V1," ")-1);              /* 姓のカナ */
 37           G/S;氏名検索/1;
 38           ISEARCH "JISHO:SEI",V2;                      /* 姓辞書を検索 */
 39           LET X31=1;                       /* 検索辞書データの最初の番号 */
 40           FOR X1={H} TO {T};
 41 $SREAD:      IREAD "JISHO:SEI",V4=@姓漢字 ;     /* 該当する漢字を読込む */
 42 $SWRITE:      LET {X1,@No. }=NUM$(X31);                  /* 番号の書込 */
 43                LET {X1,@辞書 }=V4;                        /* 姓の書込 */
 44 $SNEXT:      INEXT "JISHO:SEI";                         /* 次候補の検索 */
 45                 IF ERR(0)=36 THEN BREAK;      /* 該当する姓なければ終り */
 46              LET X31=X31+1;
 47          NEXT;
 48          LET V5="姓";  GOSUB DISP;      /* 表示のためのサブプログラムへ */
 49          LET V12=V22;                                     /* 確定した姓 */
 50
 51          CLEAR V4/22;
 52 /*## 名の辞書検索 ##*/
 53 $名:     LET V3=RIGHT$(V1,INSTR(1,V1," ")+1);               /* 名のカナ */
 54          G/S;氏名検索/1;
 55          ISEARCH "JISHO:MEI",V3;                        /* 名辞書を検索 */
 56          LET X31=1;                       /* 検索辞書データの最初の番号 */
 57          FOR X1={H} TO {T};
 58 $MREAD:      IREAD "JISHO:MEI",V4=@名漢字 ;     /* 該当する漢字を読込む */
 59 $MWRITE:     LET {X1,@No. }=NUM$(X31);                    /* 番号の書込 */
 60              LET {X1,@辞書 }=V4;                            /* 名の書込 */
 61 $MNEXT:      INEXT "JISHO:MEI";                         /* 次候補の検索 */
 62                 IF ERR(0)=36 THEN BREAK;      /* 該当する名なければ終り */
 63              LET X31=X31+1;
 64          NEXT;
 65          LET V5="名";  GOSUB DISP;      /* 表示のためのサブプログラムへ */
 66          LET V13=V22;                                     /* 確定した名 */
 67 /*## 姓名の書込 ##*/
 68          LET V11=V12+"  "+V13;                  /* 姓漢字と名漢字の合成 */
 69          DISP COLOR(C),[05,X30],"姓名漢字  =         ",COLOR(Y),V11;
 70          LET X30=X30+2;
 71          LET [X21,@漢字 ]=V11;                      /* 漢字姓名を書込む */
 72 $継続?:  DISP COLOR(C),[05,X30],"入力を続けますか?";
 73          LET X30=X30+1;
 74          DISP [15,X30],"はい[Y],いいえ[N] [Enter]=Y ";
 75          INPUT [44,X30],V30,U(E/AS/CY/P/);
 76          IF ERR(0)=55 THEN GOTO $END;
 77          IF V30="" THEN LET V30="Y";
 78          IF INSTR(1,"YyYy",V30)=0 THEN GOTO $END;
 79 $継続:   LET X21=X21+1;   DISP CLR;   GOTO $入力;
 80 $END:    CLOSE;   STOP;
 81
 82
 83 <DISP>
 84          FOR X34=1 TO 3;
 85              DISP COLOR(G),[55,X34],{L%X34};
 86          NEXT;
 87          LET X32=4;                                       /* 表示行番号 */
 88          LET X33=4;                             /* サブバッファの行番号 */
 89 $SS:     FOR X34=X33 TO X33+19;
 90 $読込:      LET V33={L%X34};
 91                 IF {X34,@辞書 }="" THEN BREAK;
 92 $表示:      DISP COLOR(G),[55,X32],V33;
 93             LET X32=X32+1;
 94          NEXT;
 95          DISP COLOR(G),[55,X32]," └───────┘";
 96
 97 $選択?:  DISP COLOR(C),[05,X30],"何番のデータ? [+]=UP, [-]=DOWN";
 98         INPUT [44,X30],V20,U(EEE/AS/CY/P/);
 99          IF V20="+" THEN GOTO $+;IF V20="-" THEN GOTO $-;
100          IF IVAL(V20)>0 THEN GOTO $選択;    GOTO $選択?;
101
102 $+:      IF {X34,@辞書 }="" THEN GOTO $選択?;
103          FOR X32=4 TO 24;  DISP [55,X32],SP20;NEXT;
104          LET X33=X33+20;  LET X32=4;   GOTO $SS;
105
106 $-:      IF X33=4 THEN GOTO $選択?;
107          FOR X32=4 TO 24;  DISP [55,X32],SP20;  NEXT;
108          LET X33=X33-20;  LET X32=4;   GOTO $SS;
109
110 $選択:   LET X30=X30+2;
111          LET V22={@%V20 ,@辞書 };
112          DISP COLOR(C),[05,X30],V5,"の漢字  =         ",COLOR(Y),V22;
113          LET X30=X30+2;
114          FOR X32=1 TO 24;  DISP [55,X32],SP20;  NEXT;
115 RETURN;
プログラムの部分はプログラム集に収録されています

戻る