検察中の文字列比較についてNo.03046
hiro さん 02/03/15 04:16
 
こんばんは、hiroです。
検索中の文字列比較について教えてください。
次のようなマクロを作りました。
----------------------------------------------------------------
    question "実行しますか?";
    if( ! result ){ endmacro;   }
    escape; gofiletop;  disabledraw;    disableinvert;//範囲選択を非表示
        golinetop;
$stoik = gettext(seltopx,seltopy,selendx+5,selendy);escape;//一回目取り込み
searchdown  "2002-..-..", regular;
$wo = gettext(seltopx,seltopy,selendx+5,selendy);escape; //二回目取り込み


while(1){
searchdown  "2002-..-..", regular;
if( !result) break;

if($stoik == $wo){ break;}//ブレイク
else{
        golineend2;
down;
golineend2;
    insert "\n\n";
$stoik = $wo;}
   
    }

    gofiletop;  enabledraw;
endmacro;
----------------------------------------------------------------

初めに取り込んだ文字列(先頭に必ずあります。)と二回目に取り込んだ文字列を比
較して違っていたら論理行末から改行を二つ入れる処理を行いたいのです(この部分
は確認済みです)。文字列というのは半角文字の年月日のことですが、これもうまく
取り込まれていることを確認しました。問題は条件判断による処理の振り分けなので
すが、これが全くうまくいきません。色々やってみたのですが、目的の処理とは逆に
同日であれば改行される結果が出ることもありました。
ところでこの「ブレイク」は「while」に戻るのでしょうか。
検索の流れがよく理解できず、つかめていないので条件判断を立てにくいのです。ど
なたかアドバイス下さい。お願いします。

[ ]
RE:03046 検察中の文字列比較についてNo.03047
ENCODINGSHIFTJIS さん 02/03/15 11:34
 
デバッグ表示を試みましょう(カーソル移動と選択範囲の関係は?)

>$stoik = gettext(seltopx,seltopy,selendx+5,selendy);escape;//一回目取り込み
menu "D1",$stoik,str(seltopx),str(seltopy),str(selendx);
>$wo = gettext(seltopx,seltopy,selendx+5,selendy);escape; //二回目取り込み
menu "D2",$wo,str(seltopx),str(seltopy),str(selendx);

>ところでこの「ブレイク」は「while」に戻るのでしょうか。
マクロのヘルプで  break と continue を調べます。

[ ]
RE:03046 検察中の文字列比較についてNo.03049
山紫水明 さん 02/03/15 20:00
 
 hiroさん,こんばんは。

》初めに取り込んだ文字列(先頭に必ずあります。)と二回目に取り込んだ文字列
》を比較して違っていたら論理行末から改行を二つ入れる処理を行いたいのです

 こういう場合は,元テキストとマクロ実行後の期待する結果を,できるだけ
簡単なサンプルとして示して頂くとわかりやすいです。

》ところでこの「ブレイク」は「while」に戻るのでしょうか。

 これについてはENCODINGSHIFTJISさんのご指摘のとおりです。

 で,期待をされているものを忖度して次のようなものにしてみました。あたっ
ているかどうかわかりませんが,一度試してください。

//----------------------------------------------------------------
//検索での表示を範囲選択にして実行
question "実行しますか?";
if( ! result ) endmacro;
gofiletop;
disabledraw;
$stoik = gettext(seltopx,seltopy,selendx+5,selendy);//一回目取り込み
while(1){
    searchdown  "2002-..-..", regular;
    if( !result) break;
    $wo = gettext(seltopx,seltopy,selendx+5,selendy); //二回目取り込み
    if($stoik == $wo) continue;
    else{
        golineend2;
        down;
        golineend2;
        insert "\n\n";
        $stoik = $wo;
    }
}
gofiletop;
endmacro;
//----------------------------------------------------------------

     では, (^^)/~
                                        山紫水明

[ ]
RE:03046 検察中の文字列比較についてNo.03051
hiro さん 02/03/15 21:33
 
こんばんは、hiroです。
ENCODINGSHIFTJISさん、山紫水明さんありがとうございます。水明さんには前回もお
世話になりました。
ところで、目的の処理ですが、説明が足らなくてすいません。以下のようなテキストを
----------------------------------------------------------------
2002-03-04     (23:50)
 文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文2002-03-05  
   (21:25)
 文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文(22:10)
 文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文2002-03-06  
   (05:30)
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字2002-03-06    
 (11:35)
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
----------------------------------------------------------------

マクロの実行後次のようにするのが目的です。
----------------------------------------------------------------
2002-03-04     (23:50)
 文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文


2002-03-05     (21:25)
 文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文2002-03-05  
   (22:10)
 文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文


2002-03-06     (05:30)
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字2002-03-06    
 (11:35)
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
----------------------------------------------------------------

つまり同じ日付であれば、改行を入れて見やすくしたいのです。
ENCODINGSHIFTJISさんに教えていただいた方法で、取得文字を確認したところやや修
正を加えてうまく行ったのですが、やはり思うように処理は流れてくれません。初め
に取得した文字がそのまま保持されているようです。その都度入れ替わって同じに見
えてるのかもしれないのですが・・・・・。
私の説明が拙かったためですが、水明さんのご参考で実行したところ次のようになり
ました。

----------------------------------------------------------------
2002-03-04     (23:50)
 文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文2002-03-05  
   (21:25)
 文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文2002-03-05  
   (22:10)


 文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文2002-03-06  
   (05:30)
 文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文2002-03-06  
   (11:35)


  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字

----------------------------------------------------------------
せっかく教えていただいて、ケチを付けるようで申し訳ないのですが、問題点を明確
にさせていただくために掲載させていただきます。恐縮です。

[ ]
RE:03051 検察中の文字列比較についてNo.03052
山紫水明 さん 02/03/15 22:32
 
 hiroさん,こんばんは。

 実は,サンプルにも通信の関係で途中に改行が入ることが,どれが本来の改行
かわかりにくいのですが,いずれにしても誤解していました。
 次のようにしたらどうなるでしょう。

//----------------------------------------------------------------
//検索での表示を範囲選択にして実行
question "実行しますか?";
if( ! result ) endmacro;
gofiletop;
disabledraw;
$stoik = gettext(seltopx,seltopy,selendx+5,selendy);//一回目取り込み
while(1){
    searchdown  "2002-..-..", regular;
    if( !result) break;
    $wo = gettext(seltopx,seltopy,selendx+5,selendy); //二回目取り込み
    if($stoik == $wo) continue;
    else{
        escape;
        insert "\n\n";
        $stoik = $wo;
    }
}
gofiletop;
endmacro;
//----------------------------------------------------------------

     では, (^^)/~
                                        山紫水明

[ ]
RE:03051 検察中の文字列比較についてNo.03053
hiro さん 02/03/15 22:39
 
>こんばんは、hiroです。

追伸です。
どうやら原因が分かりました。最初の文字の取得がなぜかおかしく倍の数だけ取り込
んでいるようです。つまり最初もこれで躓いたのですが、selendxの第三引数が(範
囲終端の列位置)見た目の文字数で、「10」にしていたところ今回のように余分に
取り込んでしまい。よく考えると相手は半角数字なので判文にやればと思い実行した
ところうまく行ったのです。
基本的に同じ指定なのですが、なぜか検索中のループの中(二回目の取得)ではちゃ
んと狙い通り半角数字10文字を取得しているのです。全く同じ指定なのにどうして
こんなことが起こるのでしょう。
数値を変えてみたのですが、同じことでどうやら論理行をすべて取り込んでいるよう
です。
しかも、gofiletopで最初に先頭に移っているはずなのに、一番最後にヒットした行
が取り込まれているようです。
実は先ほど、マクロを実行しようとメニューから「マクロ実行(X)」をクリックし
たところ、不正な処理のページ違反のダイアログが出ました。他のソフトではたびた
びあることですが、秀丸エディタでは初めてです。それもいくつか起動していた秀丸
エディタのファイルのうちそれだけが終了されました。再び同じ操作をすると同じ場
所で「他のマクロが実行中です。」というメッセージが出ました。常駐を終了させ、
すべてのファイルを終了させても同じことで、プロセスが内部で暴走しているのかと
思い、「ESC」や「STOP」ボタンを押しても反応がありませんでした。再起動
させると通常に戻ったのですが、リソース不足が原因でしょうか。先日も別のドライ
ブのショートカットが反応せず、強制終了の3ボタンを押すと「極端にリソースが不
足しています。アプリケーションを終了させてください」と出ました。その時は、Ou
tlookやVisual C++ 6.0を複数同時に起動していたので、当然かとも思ったのですが、
今回は秀丸エディタのファイルが3つほどと。ブラウザのフレーム(ホームページ)
が一つだけでした。
色々試しているうちに、どこかおかしくなって不安定になっているのかもしれません。
最初の文字列取得の失敗はそれが原因でしょうか?
だとすれば、私のパソコンだけの問題で他の人を振り回してしまうことになるかもし
れません。
機械はPC9821-V233M7C2 メモリ96M 外付けハードディスク8Gです。

[ ]
RE:03051 検察中の文字列比較についてNo.03054
hiro さん 02/03/15 22:51
 
hiroです。

山紫水明さんありがとうございました。
一発でうまく行きました。どこがどう違うのかまだよく検討していないので分からな
いのですが、結果はばっちりです。本当にありがとうございました。
結果を参考に改めて勉強させていただきます。

[ ]
RE:03052 検察中の文字列比較についてNo.03057
安久津 さん 02/03/16 06:38
 
こんにちは、hiroさん、山紫水明さん、安久津といいます。

>question "実行しますか?";
>if( ! result ) endmacro;
>gofiletop;
>disabledraw;
>$stoik = gettext(seltopx,seltopy,selendx+5,selendy);//一回目取り込み

「ヤバイよ、ヤバイよ、この $stoik はヤバイよ」#と出川風に登場。(^^;)
seltopx, seltopy, selendx, selendy は、マクロを起動したときに、
リセットされるものではありません。
選択しないでマクロを起動しても、以前にユーザーが手動で
選択した範囲の値を保持しています。
特に、この場合はカーソル位置と無関係な(つーかゴミ)値です。

任意の範囲を選択して、それを解除(ESC)してから、次のマクロを
実行すると、古い選択範囲を保持していることが分かります。

$$s = "(" + str(seltopx) + ", " + str(seltopy) + ")\n" +
      "(" + str(selendx) + ", " + str(selendy) + ")";
      message $$s;
endmacro;

この値は、次に選択するまで、保持されています。
変な例外もあって、編集すると微妙に変化します。
以下検証。

    ##cur = hidemaruhandle(0);
    newfile;
    ##new = hidemaruhandle(0);
    while( lineno <= 10 ){
        insert str(lineno) + "\n";
    }
//  gofileend;
    beginsel;
    movetolineno 1, lineno - 2;
    escape; // escape で selectvar はリセットされません。
    call showselectvar;
    gofileend;
    insert "11\n12\n13\n";
    call showselectvar; // 編集すると、変化する。
    setactivehidemaru ##cur;
    closehidemaruforced ##new;
endmacro;
showselectvar:
$$s = "(" + str(seltopx) + ", " + str(seltopy) + ")\n" +
      "(" + str(selendx) + ", " + str(selendy) + ")";
      message $$s;
return;

編集すると変化しますが、この値を信用してはいけません。
#と、以前番頭++さんに教えてもらった。(^^ )>>
では。

[ ]
RE:03057 検察中の文字列比較についてNo.03061
山紫水明 さん 02/03/16 09:59
 
 安久津さん,こんにちは。

》「ヤバイよ、ヤバイよ、この $stoik はヤバイよ」#と出川風に登場。(^^;)

 お出まし,恐縮です(^^;
 あっ! ヤバイです,たしかに。
 元のマクロを少しでも活かして,と思っているうちに肝腎なことでぬかってし
まいました。
 出だしの部分,次のようにすべきでした。

question "実行しますか?";
if( ! result ) endmacro;
disabledraw;
gofiletop;
searchdown2  "2002-..-..", regular;
if( !result ) endmacro;
else $stoik = gettext(seltopx,seltopy,selendx+5,selendy);//一回目取り込み
while(1){
・・・・・


》変な例外もあって、編集すると微妙に変化します。
》以下検証。

 検証できました。
 それで,さらに1行追加してみました。

    ##cur = hidemaruhandle(0);
    newfile;
    ##new = hidemaruhandle(0);
    while( lineno <= 10 ){
        insert str(lineno) + "\n";
    }
//  gofileend;
    up; //@@@これを追加
    beginsel;
    movetolineno 1, lineno - 2;
    escape; // escape で selectvar はリセットされません。
    call showselectvar;
    gofileend;
    insert "11\n12\n13\n";
    call showselectvar; // 編集すると、変化する。
    setactivehidemaru ##cur;
    closehidemaruforced ##new;
endmacro;
showselectvar:
$$s = "(" + str(seltopx) + ", " + str(seltopy) + ")\n" +
      "(" + str(selendx) + ", " + str(selendy) + ")";
      message $$s;
return;

 この場合は,何か EOF と関連がありそうな気がしますが,はっきりとは
わかりません。

     では, (^^)/~
                                        山紫水明

[ ]
RE:03061 検察中の文字列比較についてNo.03064
安久津 さん 02/03/16 11:47
 
> この場合は,何か EOF と関連がありそうな気がしますが,はっきりとは
>わかりません。

    ##cur = hidemaruhandle(0);
    newfile;
    ##new = hidemaruhandle(0);
    while( lineno <= 10 ){
        insert str(lineno) + "\n";
    }
    moveto 0, 5; beginsel;
    moveto 0, 8;
    call showselectvar;
    escape;
    moveto 0, 6;
    insert "add 1\nadd 2\nadd 3\n";
    call showselectvar;
    undo;
    deleteline; deleteline; deleteline;
    call showselectvar;
    setactivehidemaru ##cur;
    closehidemaruforced ##new;
endmacro;
showselectvar:
$$s = "(" + str(seltopx) + ", " + str(seltopy) + ")\n" +
      "(" + str(selendx) + ", " + str(selendy) + ")";
      message $$s;
return;

選択範囲の中で、行の数を変える編集と連動します。( Ver3.08 )
では。#脱線でした。(^^ )>>

[ ]
RE:03057 検察中の文字列比較についてNo.03068
hiro さん 02/03/17 09:02
 
hiroです。
>
>編集すると変化しますが、この値を信用してはいけません。
>#と、以前番頭++さんに教えてもらった。(^^ )>>
>では。


安久津さんありがとうございます。最初は無関係の話題かと理解が出来なかったので
すが、ようやく問題点が見えてきました。しかし、私の目的のより場合、山紫水明さ
んから頂いたサンプルは今のところ完璧で、値が不安定になるようなこともなさそう
です。実行したファイルは1200行あまりですが、すべてのステップを5秒ぐらい
で完了します。(233MhのCPU)
次のソースです。
----------------------------------------------------------------
disabledraw;

//不用文字検出削除
gofileend;
replaceup "\"シークレット\",\"カテゴリ\",\"開始日\",\"終了日\",\"内容\",\"コストコード\",\
"顧客コード\",\"保留\"", "", regular;
while (result) findup;

gofileend;
replaceup ":00.000000000\",\"2002-..-.. ..:..:00.000000000\",\"", "", regular;
while (result) findup;

gofileend;
replaceup "\",\"\",\"\",0", "", regular;
while (result) findup;

gofileend;
replaceup "0,\"\",\"", "", regular;
while (result) findup;


//日付時刻部分を除き、改行。
gofiletop;

while( 1 ){
searchdown  "2002-..-.. ..:..", regular;
if( !result) break;
if("2002-..-.. ..:.." == "2002-..-.. ..:.."){
         golinetop;
        right 16;
insertreturn;
insert " ";


}




}



//時刻を()で囲む
gofiletop;
//時間()整形
#t = 0;
while(1){
searchdown  "2002-..-.. ..:..", regular;
if( !result) break;
if("2002-..-.. ..:.." == "2002-..-.. ..:.."){
         golinetop;
        right 11;
insert "    (";
right 5;
insert ")";
down;
insert " ";
#t = #t + 1;
}

}



//--------------------------------------------------------//
//gofileend;
//while( 1 ) {
//    searchup "2002-..-..", regular;
//    if( !result ) break;
//    $q[#w] = gettext( seltopx, seltopy, selendx, selendy );
//  escape;//必要であれば
//    #w = #w + 1;
//}
//menuarray $q, #w;//確認のため
//--------------------------------------------------------//
//#w = 0;
//gofiletop;
//while( #w >= 0 ){
//insert $q[#w];
//insert "\n";
//#w = #w - 1;
//
//}


gofiletop;

deleteline;
//検索での表示を範囲選択にして実行
gofiletop;
disabledraw;
$stoik = gettext(seltopx,seltopy,selendx+5,selendy);//一回目取り込み
while(1){
    searchdown  "2002-..-..", regular;
    if( !result) break;
    $wo = gettext(seltopx,seltopy,selendx+5,selendy); //二回目取り込み
    if($stoik == $wo) continue;
    else{
        escape;
        insert "\n\n";
insert "--------------------------------------------------------------------
-----------\n";
        $stoik = $wo;
    }
}
gofiletop;

message "結果" + str(#t) + "レコードありました。\n(終わり)";


endmacro;

//----------------------------------------------------------------
enabledraw;
endmacro;

----------------------------------------------------------------
山紫水明さんの画竜点睛によって、日の目を見て実行できるようになったのですが、
まだまだ無駄な部分があるかもしれません。
これは今月の初め頃の投稿でも紹介してあるのですが、Lotus社のオーガナイ
ザー 97から「他形式で保存(メニューのなか)」ではき出したものを見やすく整形
するものです。まだまだ手を加える余地はあると思いますが、どなたか関心のある方
がいれば、手直しして完成させてください。オーガナイザー の最新版は2001で、
それも3,450円で売っているのですが、諸事情により私は買っておらず、使った
こともないのです。Lotus社の公表によれば全国に700万人のユーザーがいる
らしいので、うまく出来上がれば人様の役にも立つのではと思います。私はそんな自
信も実力もないので、どなたかやってくだされば、と思います。改行位置など環境に
よっては、少し値を変更してやる必要も出るかと思いますが、練れば変数として臨機
応変に対処できると思われます。このマクロでも、1250行が5秒とかからぬうち
に整形されます(ちなみに、1500行ぐらいになります)。以前、手作業でやって
いたときは、大変な時間がかかり、この規模では半日ほどかかるかもしれません。
私は、ロータスの関係者でも宣伝屋でもないのですが、タダでパソコンについていた
ソフトで、このオーガナイザー 97には、長い間世話になりました。秀丸エディタも
愛用させていただいております。
とにかく幅広いかたちで、人の役に立ってくれればありがたいので、参考までに掲載
致します。


[ ]