回答箱 No.141-3: メール本文の中の日付を取り出しバインダー名にしたい
        ◆ 質問箱 No.141 質問者: 元山 よし子  2002年09月 248号 P.14
            ◆ 質問箱 目次へ
No.141-3   メール本文の中の日付を取り出しバインダー名にしたい 回答者
  入川 精二
2002年10月
249号 P.18
 質問の文中に私の名前が出てくるので、ホッカムリしている訳にいきません。
 回答を考えるに当たって、「人事異動情報」はPIPSに取り込み済みであり、その1頁が画面に表示されていることを前提にしました。また、「配信日」の文字列のある行には、続いて':'(コロン)と、数字を挟んで'年' '月' '日'があることも前提です。
 ちょっと難題なのは':'(コロン)が全角か半角か分からないこと、数字の前後にスペースがあるかどうかも分からないことです。分かっていればプログラムは簡単になりますが、分からないことを前提にして組み立てたのが次頁の<配信日>です。

 2〜4行で配信日のデータが何行目にあるか探します。見つかれば6行目に飛びます。
 6行目以降は各行にコメントを付けていますので、そちらを見てください。
 年月日の数字の前後にスペースがあるとき、文字の前のスペースは変数に取り込むと無視されますが、後のスペースはそのまま取り込まれます。このスペースを削除するのが13行の処理です。(16行・20行にもあります)
 LET V03=NUM$(VAL(V03)); は一度数値に変換して再び文字列に戻しています。こうすることで後のスペースが除去されます。(スペースがなければそのままです)
 「7月」のように数値が1桁の時、頭に'0'を補う必要があります。17行目(21行目も)でその処理をしています。
 こうして年(4桁)月(2桁)日(2桁)の文字を合成して8桁の'V06'を得ます。
 このプログラムは'V06'の内容を画面に表示して終わりです。
 この結果をどのように利用するかは質問者にお任せします。

《'0'を補って桁数をそろえる》
 データが数値でなく「コード」の場合、桁数が違うとトラブルの種になります。ある取引先のコードが'0068'のとき、本来は4桁入力してもらいたいところですが、入力の効率を考えると頭の'0'を省略していても受け付けて、プログラムの方で'0'を補って4桁にそろえることがよくあります。(厳密に云うと邪道ですが実務上やむを得ないときもあります)
 そんな時に使う手法がプログラム30行以下の部分です。通常はもっといろいろチェックをかけますが、おおよそこんな具合です。
 各行にコメントが付けてありますので解説は必要ないと思います。参考まで。

 1 <配信日>
 2          FOR X01=1 TO 20;
 3               IF L%(X01)="=*配信日*" THEN GOTO $配信日;
 4          NEXT;
 5          GOTO $ERR0;
 6 $配信日: LET V01=L%(X01);                           /* 配信日の行を読込む */
 7          LET X02=INSTR(1,V01,":");          /* 半角コロンの位置をチェック */
 8             IF X02>0 THEN GOTO $年月日;    /* 半角コロンがあれば$年月日へ */
 9          LET X02=INSTR(1,V01,":");             /* 全角コロンの位置をチェック */
10 $年月日: LET V02=RIGHT$(V01,X02+1);       /* コロンの右側の文字列を読込む */
11 $年:     LET X03=INSTR(1,V02,"年");               /* '年'の位置をチェック */
12          LET V03=LEFT$(V02,X03-1);                    /* 年の左側の文字列 */
13          LET V03=NUM$(VAL(V03));                  /* 前後のスペースを除去 */
14 $月:     LET X04=INSTR(1,V02,"月");               /* '月'の位置をチェック */
15          LET V04=MID$(V02,X03+1,X04-X03);       /* '年'と'月'の間の文字列 */
16          LET V04=NUM$(VAL(V04));                  /* 前後のスペースを除去 */
17             IF LEN(V04)=1 THEN LET V04="0"+V04;  /* もし1桁なら'0'を補う */
18 $日:     LET X05=INSTR(1,V02,"日");                   /* '日'の位置をチェック */
19          LET V05=MID$(V02,X04+1,X05-X04);       /* '月'と'日'の間の文字列 */
20          LET V05=NUM$(VAL(V05));                  /* 前後のスペースを除去 */
21             IF LEN(V05)=1 THEN LET V05="0"+V05;  /* もし1桁なら'0'を補う */
22          LET V06=V03+V04+V05;                             /* 年月日を合成 */
23          MESSAGE V06;
24 $END:    STOP;
25
26 $ERR0:   MESSAGE "配信日のデータがありません";
27          GOTO $END;
28
29
30 <4ケタ>
31 $コード: ACCEPT "コードは?  [数字4桁]",V01;
32             IF ERR(0)=55 THEN GOTO $END;            /* [Esc] が押された */
33             IF V01="" THEN GOTO $コード;          /* [Space] が押された */
34             IF LEN(V01)>4 THEN GOTO $コード;   /* 桁数が4ケタより大きい */
35             IF VAL(V01)=0 THEN GOTO $コード;              /* 数値でない */
36 $4ケタ:     IF LEN(V01)=4 THEN GOTO $EXE;        /* 丁度4桁なら $EXE へ */
37          LET V01="0"+V01;
38          GOTO $4ケタ;
39 $EXE:    MESSAGE "V01 = "+V01;
40          /*・・・・・・・・  */
41
42
43 $END:    STOP;

回答箱のプログラムがプログラム集に収録されています。


このページのTOPへ戻る