AND 検索についてNo.06105
usk さん 00/07/02 20:48
 
はじめて投稿します。
以前、日記ソフトの検索(06069)で、
>よくYahoo!などで検索窓にいれる「渋谷 サウナ」という具合にスペース
>かカンマで区切って検索するものをGrepで。
と、ありましたが、秀丸担当者から QGrep を勧めておられました。

一行内での And 検索をしたいのですが、秀丸で QGrep をどのように組み込めばよい
のでしょうか?
秀丸の検索で毎回正規表現を使うのが面倒でのでよろしくお願いします。


[ ]
RE:06105 AND 検索についてNo.06106
きいろいまふらあ さん 00/07/03 10:59
 
uskさんこんにちは。きいろいまふらあといいます。

>秀丸で QGrep をどのように組み込めばよい
>のでしょうか?

秀丸の中からQGrepを起動するということであれば、
その他→プログラム実行 か、
マクロでrun(またはrunsync,runsync2)を使うことになります。

検索結果を秀丸で表示したいということであれば、QGrep側の設定になります。
結果をファイルに書きこんだり、grep後に起動するアプリケーションを指定してやっ
たり
できたはずです。「終了時コマンド」とかいったはず。
#QGrepはサイトー企画のソフトではないので、ここで扱う話題でない気もしますが。

>秀丸の検索で毎回正規表現を使うのが面倒でのでよろしくお願いします。

1行内なら、
(渋谷.*サウナ|サウナ.*渋谷)
これだけです。「渋谷」が必ず先に来ることがわかってるなら
渋谷.*サウナ
です。面倒ですか?……確かに面倒かも。(^^;

[ ]
RE:06106 AND 検索についてNo.06125
usk さん 00/07/04 14:45
 
きいろいまふらあさん 素早いお返事に感謝しています。
And 検索のことですが、正規表現で3個以上の場合にどのようにするのでしょうか?
>(渋谷.*サウナ|サウナ.*渋谷)

それから、質問が少しずれますが、秀丸での検索にQGrep を使うことはできるのでし
ょうか。
これも、3個以上の And 検索ができれば、すごく助かるのですが…
いずれにしても、検索を多用しますので、できるだけ簡単な方法を教えていただきた
いのです。
初心者ですがよろしくお願いします。


[ ]
RE:06125 AND検索についてNo.06126
きいろいまふらあ さん 00/07/05 00:38
 
uskさんこんばんは。きいろいまふらあです。

>And 検索のことですが、正規表現で3個以上の場合にどのようにするのでしょうか?

3個の場合出現する順番が決まっていれば

A.*B.*C

でいけますが、順番が不定なら

(A.*B.*C|A.*C.*B|B.*A.*C|B.*C.*A|C.*A.*B|C.*B.*A)

としてやらないといけないです。さすがにこれは面倒ですね。
4個以上も順列組み合わせです。

grepを繰り返し実行するとか、マクロを使うとかいろいろ方法は
あると思いますが、潔くQGrep等の外部アプリケーションを利用する
のが賢いかもしれませんね。

秀丸の中からQGrepを起動するとか、QGrepの結果を秀丸に取り込む件については、
とりあえず#06106に書いたのがとっかかりです。

QGrepはお持ちですか?
まずは入手されて単独でお使いになってみて下さい。
#Vectorとかにあるはず。
単独で使えるようになったら、#06106のアプローチで、秀丸と連携させて
使えるようにするとよいと思います。

[ ]
RE:06126 AND検索についてNo.06135
usk さん 00/07/07 10:06
 
きいろいまふらあさんお世話になります。
迅速なコメントをいただきながら、遅い返答ですみません。

>QGrepはお持ちですか?
>まずは入手されて単独でお使いになってみて下さい。
>単独で使えるようになったら、#06106のアプローチで、秀丸と連携させて
>使えるようにするとよいと思います。

QGrep を単独で使いました。

>秀丸の中からQGrepを起動するということであれば、
>その他→プログラム実行
で、できました。
これを「キーの割り当て」で使うには、マクロが必要なのでしょうか?

また、秀丸で開いたファイル上で、検索するように使うには、どのようにしたらよい
のでしょうか。

初歩的な質問だと思いますが、検索をできるだけ簡単に済ませたいと思いまして…

[ ]
RE:06105 AND 検索についてNo.06136
ENCODINGSHIFTJIS さん 00/07/07 12:10
 
>一行内での And 検索をしたいのですが、秀丸で QGrep をどのように組み込めばよ
>いのでしょうか?
>秀丸の検索で毎回正規表現を使うのが面倒でのでよろしくお願いします。

秀丸に万能テキストツールの夢を見るのは無理です、世の中甘くない。
Grep類以外で タダで使えるものを探すと MSXML3.dll があります。
まだプレピュー版で 開発者の体力がないとだめですが。   気分だけでも
Grepほど高速でもなく、大量データにも適してないかも
正規表現検索はできない、LIKE,SIMULAR 指定の あいまい検索もできない
XSLT または DOM & WSH を書けること。XMLの知識は必須です。

日記テキストを XML化 して XSLTソース発生&RUN を秀丸マクロで書くと
自動化できるかもしれない。

---------- diary.xml  検索対象
<?xml version="1.0" encoding="Shift_JIS"?><!-- diary.xml -->
<赤い日記帳>
<楽しい一日>00/07/07 sldjサウナsdkds渋谷asljflsja</楽しい一日>
<楽しい一日>00/01/31 wopq渋谷slj.コーヒー牛乳skjddkサウナsadjf</楽しい一日>
</赤い日記帳>
---------- diary.xsl  検索指定
<?xml version="1.0" encoding="Shift_JIS"?><!-- diary.xsl -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  version="1.0">
<xsl:output method="xml" encoding="Shift_JIS"/>

<xsl:template match="/">
<AND検索結果>

<xsl:for-each select="//楽しい一日">
<xsl:if test="contains(.,'コーヒー牛乳')
          and contains(.,'サウナ')
          and contains(.,'渋谷')" >
<xsl:copy-of select="."/><!-- 抽出 -->
</xsl:if>
</xsl:for-each>

</AND検索結果>
</xsl:template>

</xsl:stylesheet>
------------------- 検索結果
<?xml version="1.0" encoding="Shift_JIS"?>
<AND検索結果>
<楽しい一日>00/01/31 wopq渋谷slj.コーヒー牛乳skjddkサウナsadjf</楽しい一日>
</AND検索結果>

__END__

[ ]
RE:06136 AND 検索についてNo.06137
usk さん 00/07/08 16:52
 
uskです。
ENCODINGSHIFTJIS さん世の中を教えてくださってありがとうございました。

>秀丸に万能テキストツールの夢を見るのは無理です、世の中甘くない。

教えてくださった内容は、ほとんど理解できませんでした。まだまだ修行が足りない
ようです。
そんなことで、世の中の味を未だ知りませんので、まだ甘い希望を持っています。
質問のきっかけは、単純に And 検索ができないかなと思ってのことで、そんなに難
しいとは、わかりませんでした。
And 検索では、3個できれば、ほとんど満足なのですが、…
マクロを組んで検索のダイアログからできないものでしょうか。
勉強して出直してこいと言われそうですが。

[ ]
RE:06135 AND検索についてNo.06138
ひろ さん 00/07/08 17:02
 
 usk さん今日は、ひろです。
> >秀丸の中からQGrepを起動するということであれば、
> >その他→プログラム実行
> で、できました。
> これを「キーの割り当て」で使うには、マクロが必要なのでしょうか?
 「プログラムの実行」までなら「キーの割り当て」だけで出来ますが、常
に「Qgrep」を起動するようにするには macro を書く必要がでてきます。

 macro の内容は、
//----------- qgrep.mac --------------------
run "E:\\Program Files\\qgrep\\Qgrep32.exe";
//------------------------------------------
となります。

[ ]
RE:06137 AND 検索についてNo.06139
山紫水明 さん 00/07/09 10:18
 
    uskさん こんにちは。

》そんなことで、世の中の味を未だ知りませんので、まだ甘い希望を持っています。

 私も世の中の味を知らない部類です(^^;

》And 検索では、3個できれば、ほとんど満足なのですが、…
》マクロを組んで検索のダイアログからできないものでしょうか。

 それで,恐いもの知らずで次のようなマクロを考えてみました。きいろいまふら
あさんの #6126 のご発言から,敢えてやってみました。

//------- 3grep.mac -------------------------------------------------//
//    3語の AND 検索
if(imestate) imeswitch;
#number = val(input("検索語数は?(2または3)","3"));
if(!result) endmacro;
imeswitch;
$a = input("検索語1");
$b = input("検索語2");
if(#number > 2) $c = input("検索語3");

$search = $a + ".*" + $b + ".*" + $c + "|" + $a + ".*" + $c + ".*" + $b
 + "|" + $b + ".*" + $a + ".*" + $c + "|" + $b + ".*" + $c + ".*" + $a
 + "|" + $c + ".*" + $a + ".*" + $b + "|" + $c + ".*" + $b + ".*" + $a;

grep $search, "*.*", ".",regular, subdir;
endmacro;
//------------------------------------------------------------------//

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


[ ]
RE:06139 AND 検索についてNo.06140
ENCODINGSHIFTJIS さん 00/07/10 09:07
 
uskさん こんにちは。

マークアップ・テキストはエスニック過ぎますか?
ソフト業界では今 大人気の 料理なんでよ。
-------------------------------------
伝統の技を究めて 仙人の域に達する道もアリですから。

ユーザーインターフェイスなど細かな調整はそちらで
前処理として一件ごと  (){  で区切ります。

−−−−−−−−−−−−−−−−−−−−−−−−−
// AND3SEL.mac
// 3単語 共起 のタグジャンプ
//
// 末尾まで繰り返し
//     区間を選択
//         区間内を検索
//
escape; gofiletop #count=0;
              #y=y;  nextfunc
while(#y!=y){ #y=y;
selectcfunc searchdown "モノ",inselect;if(!result)goto next1;
selectcfunc searchdown "ラウ",inselect;if(!result)goto next1;
selectcfunc searchdown "ノク",inselect;if(!result)goto next1;
// 共起を発見 ここでは 区間の先頭の行番号を記憶
prevfunc #and3line[#count]=lineno; #count=1+#count;
// 次の区間に
next1: nextfunc
 }
// 末尾書き出し タグジャンプ行
$filename=filename; gofileend
while(#count>0){ insertreturn #count=#count-1;
insert $filename;
insert ": ";
insert str(#and3line[#count]);
 }

−−−−−−−−−−−−−−−−−−−−−−−−
// テストデータ and3test.txt
(){
ポーカーフェイス
(){
ユー
(){
トラスト
(){
フォーマイディア
(){
ディペンドオンユー
(){
ファトエバー
(){
ラブ
(){
トゥービー
(){
ボーイズアンドガールズ
(){
モノクローム、トゥーレイト、トラウマ、エンドロール
(){
アピアーズ
(){
カナリヤ
(){
フライハイ
(){
ボーグ
(){
ファーラウェイ
(){
シーズンズ
(){

ここに タグジャンプ行が付加される。


[ ]
RE:06139 AND検索についてNo.06141
きいろいまふらあ さん 00/07/10 09:34
 
山紫水明さんこんにちは。まふです。

()を付けなくてもいけるんですね。なるほど。逆に

$search = $a + ".*\(" + $b + ".*" + $c + "|" + $c + ".*" + $b + "\)|"
 + $b + ".*\(" + $a + ".*" + $c + "|" + $c + ".*" + $a + "\)|"
 + $c + ".*\(" + $a + ".*" + $b + "|" + $b + ".*" + $a + "\)";

とするとちょっと短くできますね。

ところで検索語数が2の場合、$searchに無駄が多くなる気がします。
検索自体はできるような気もしますが、ご承知の上ですか?

[ ]
RE:06141 AND検索についてNo.06142
山紫水明 さん 00/07/10 22:04
 
    きいろいまふらあさん こんばんは。

》$search = $a + ".*\(" + $b + ".*" + $c + "|" + $c + ".*" + $b + "\)|"
》 + $b + ".*\(" + $a + ".*" + $c + "|" + $c + ".*" + $a + "\)|"
》 + $c + ".*\(" + $a + ".*" + $b + "|" + $b + ".*" + $a + "\)";

》とするとちょっと短くできますね。

 なるほど,少し贅肉がとれますね。

》ところで検索語数が2の場合、$searchに無駄が多くなる気がします。
》検索自体はできるような気もしますが、ご承知の上ですか?

 ええ,これでもまあいけると思って手抜きした確信犯です。でも,さすがに眼光
鋭いまふさんには見逃してもらえなかった(^^;
 で,結局,この部分次のようにしたらベストですね。
usk さん,入れ換えてください。

if(#number == 2) $search = $a + ".*" + $b + "|" + $b + ".*" + $a;
else $search = $a + ".*\(" + $b + ".*" + $c + "|" + $c + ".*" + $b + "\)|"
 + $b + ".*\(" + $a + ".*" + $c + "|" + $c + ".*" + $a + "\)|"
 + $c + ".*\(" + $a + ".*" + $b + "|" + $b + ".*" + $a + "\)";

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

[ ]
RE:06142 AND検索についてNo.06143
きいろいまふらあ さん 00/07/11 01:40
 
山紫水明さん、こんばんは。

> なるほど,少し贅肉がとれますね。

いや、検索文字列が短くなるだけで、検索の効率はかえって下がるかもしれないです。

> ええ,これでもまあいけると思って手抜きした確信犯です。

いや、それなら何も申し上げることはございませんです。ほんとに。(^^;

で、せっかくなので自分の好みで自分向けに改造してみました。
#ここまで来ると4番会議室ネタですが。

//---
$a = input("検索語1");
if($a = "") endmacro;
$b = input("検索語2(空入力で1語検索)");
if($b != ""){
$c = input("検索語3(空入力で2語検索)");
}

if($b == "")$search = $a;
else if($c == "")$search = $a + ".*" + $b + "|" + $b + ".*" + $a;
else $search = $a + ".*\(" + $b + ".*" + $c + "|" + $c + ".*" + $b + "\)|"
 + $b + ".*\(" + $a + ".*" + $c + "|" + $c + ".*" + $a + "\)|"
 + $c + ".*\(" + $a + ".*" + $b + "|" + $b + ".*" + $a + "\)";

grep $search, "*.*", ".",regular, subdir;
endmacro;
//---

[ ]
RE:06140 AND 検索についてNo.06144
ENCODINGSHIFTJIS さん 00/07/11 10:13
 
uskさん こんにちは。

(){ で区切るのは 1件複数行でも対応できるし、否定の問い合わせも
簡単に作れるので 手元に置いておくとよいでしょう。

(){ で前処理するのがイヤならば 通常に 3Grep結果の集合演算でしょう。
データベース操作を実装する方法は教科書にいろいろ載っています。
一行内ですから 3Grep結果のファイル名:行番号は一致する。

SORTを使う場合
3Grep結果を1ファイルに連結して Merge/Sort する。頭から舐めて
3重複行を抽出する。処理は早くないが 使えるだろう。

マクロ内で配列を使いAND演算する、HASH値のライブラリがあると、早い
のが書ける。カーソルを3本立ててMergeをマクロでエミュレートする。
などなど    速さを追求する時は工夫してみてください。


[ ]