<Split関数で複数キーワードをスペースで分解する>
こんにちは、三流プログラマーのKen3です。 今回は、 スペースで区切られた検索条件で遊んでみたいと思います。/* * 1.今回のキッカケ */
掲示板で下記の質問をもらいました ------ 質問1:検索キーワードにおいて、複数キーワードを区切る祭 半角/全角スペースの入力に対応方法は可能でしょうか? (半角だけのは出来ているのですが・・・) ・ ・ ・ splkey = Split(Request.Form("keywd")," ") SQL="SELECT * FROM all_info WHERE search Like '%" & splkey(0) & "%' " For i=1 To UBound(splkey) SQL=SQL & "OR search like '%" & splkey(i) & "%' " Next Set rs=db.Execute(SQL) ------ と、 フリーワードの検索処理みたいですね。/* * 2.単純に考えて、全角スペースを半角スペースへ置換する */
三流 プログラマー 三流□プログラマー ※□は全角スペースだと思ってください スペース区切りで検索キーワードを入れるのかぁ。 それをSplit関数でバラす、そんな感じですね。 試しに、昔作成したSplit関数のテストプログラムを使ってみると、 http://www.ken3.org/cgi-bin/test/test024-2.asp で、 三流 プログラマー と全角のスペースをテストすると 元のデータは、[三流 プログラマー]です strBOX(0) -- 三流 プログラマー あらら、分解できないよ・・・ 問題点を整理すると、 ^^^^^^^^^^^^^^^^^^ 全角の空白だとSplit関数で分解できない。 って、ことですね。 あたりまえか、全角のスペースと、半角スペースを区別しているんだから。 そっか。チョット融通効いてもいいのにねコンピュータは正直だから。 頭固い男は美人オペレーターに嫌われるって、コンピュータ君に教えてあげなきゃ。 ~~~~~~~~~~~~~~~~~~~~~~ さて、どうやって、教えるかな。 全角スペースと半角スペースの区別が付かないので、 全角スペースを半角スペースに変換してから、キーワードの分解処理を行う、 そんな対応方法をコンピュータに教えてやるか。 全角スペース□を半角スペースにReplace関数で置換する strMOTO = Replace(strMOTO, " "," ") その後、Split関数を使用して、スペース指定で配列を作成する strBOX = Split(strMOTO, " ") って、流れで、作成してみました。 http://www.ken3.org/cgi-bin/test/test081-1.asp で、テストできるので、遊んでみてください。 test081-1.asp ---- <%@LANGUAGE=VBScript%> <html> <head> <title>キーワード分解 Replace関数とSplit関数とUBound関数</title> </head> <body> <h1>キーワード分解 Replace関数とSplit関数とUBound関数</h1> test081-1.asp<br> スペースで区切って好きな言葉を入れてください(全角半角スペースまぜてね)<br> <FORM ACTION="test081-1.asp" METHOD="POST"> <INPUT TYPE="text" SIZE="40" NAME="DATA" VALUE="AB 型 三流君 ←全角"><BR> <INPUT TYPE="submit" VALUE="分割実行"> <INPUT TYPE="reset" VALUE="クリア"> </FORM> 分割実行ボタンを押すとReplace関数で全角スペースを半角に置換してから<br> Split関数とUBound関数を使用してデータ分割表示します<br> <br> <% '入力パラメーターDATAがあるかチェックする If IsEmpty(Request.Form("DATA")) = False Then Response.Write "<hr><b>テスト結果</b><br>" 'データが入力されていたら、バラして表示する Dim strMOTO strMOTO = Request.Form("DATA") 'Postで受け取ったデータ Response.Write "元のデータは、[" & strMOTO & "]です<br>" '全角スペース□を半角スペースに置き換える strMOTO = Replace(strMOTO, " "," ") 'スペースでデータをバラす strBOX = Split(strMOTO, " ") '区切り文字にスペース指定 'ループでデータを表示させる For i = 0 To UBound(strBOX) 'UBound使用インデックス最大値までループ Response.Write "<BR>" Response.Write "strBOX(" & i & ") -- " '変数名表示 Response.Write strBOX(i) '中身を表示 Next End If %> <hr> 処理概要:<br><code> 全角スペース□を半角スペースにReplace関数で置換する<br> strMOTO = Replace(strMOTO, " "," ")<br> その後、Split関数を使用して、スペース指定で配列を作成する<br> strBOX = Split(strMOTO, " ")<br> Split関数で配列を作成後、<br> 'ループでデータを表示させる<br> For i = 0 To UBound(strBOX) 'UBound使用インデックス最大値までループ<br> とUBound関数で配列の要素数を判断、ループさせてます。</code><br> </body> </html> -- 余談 -- ASP VBScript関数の解説とサンプルをまとめる http://www.ken3.org/cgi-bin/group/asp_vbscript.asp も、ヒマな時見て笑ってください。/* * 3.Split関数の意外な盲点? */
よし、これで、Webの恋人検索画面で男性操作者が かわいい□素直□明るい性格 なんて検索条件を入れても、分解して検索可能になったかなぁ。 いつもの小芝居を1つ(最近不評だけど) ^^^^^^^^^^^^^^^^^^^^ 恋人紹介の怪しい場所での風景? オイ責任者出せ責任者 なんでしょうか? なんだこの恋人検索システム、 保母 看護婦 で検索したのに、 家事手伝い や OL や 秘書 が検索結果として出力されるよ えっ、(冗談でしょう?操作間違ってんだろ会いたい会いたいと興奮して) 客のオレ様がウソ言ってると思うのか?やってみろよ。(別な意味で興奮?) チッ、パソコン使えねぇエロオヤジが・・・と心で思いつつ、 (営業スマイルで)「では、私が試しにやってみますね」 保母 看護婦 で、でますよXX件、あとがんばってくださいね(手間かけさせやがって) なんて、小話は、置いといて、 話の展開、バレましたよね。 全角スペースじゃなくて、 今度は、半角スペースを2つ書いてみると、 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 保母 看護婦 を http://www.ken3.org/cgi-bin/test/test081-1.asp でテストしてみると、(半角SP2つを入れてキーワードを区切ってみると) strBOX(0) -- 保母 strBOX(1) -- strBOX(2) -- 看護婦 あらら、見事に1つ抜けましたね。 連続するスペースをSplit関数では、判断できないみたいですね。 これで、条件を作成すると、"..OR 項目 Like '%%'"みたいになって、 全件検索されて、 保母さん、看護婦さん が大好きなおじさんに怒られるよ(笑) システムの作り手は、 ^^^^^^^^^^^^^^^^^^^^ パソコン操作上手なので、気が付かないけど、 スペースを2つや全角スペースの入力はあると思う。 さて、看護婦好きのおじさんのタメに、少し細工するか。 一番安易なのは、 また同じ思考で行くと、Replace関数で半角2つを半角1つに置換する。 '全角スペース□を半角スペースに置き換える strMOTO = Replace(strMOTO, " "," ") 'さらに、半角スペース2個を半角スペース1個にする strMOTO = Replace(strMOTO, " "," ") 'スペースでデータをバラす strBOX = Split(strMOTO, " ") '区切り文字にスペース指定 でOKかなぁ。 場当たり的な対応なんだよね ^^^^^^^^^^^^^^^^^^^^^^^^^^ なにが?(いつもの半ギレ) 出来たよ半角2つでも検索OKになったよ。 半角スペース2個を半角スペース1個にする strMOTO = Replace(strMOTO, " "," ") そんな対応なんだぁ、(バカにしたような目線を送りつつ) じゃ、半角3つスペースがあったら? あれ?おかしいなぁ。 strMOTO = "高収入 高学歴" とスペース3つを strMOTO = Replace(strMOTO, " "," ") で置換しても、 "高収入 高学歴" 3つが2つに減るだけなんですね。 うるせえなぁ。(アラばかり探しやがってこのヤロウ!) strMOTO = Replace(strMOTO, " "," ") strMOTO = Replace(strMOTO, " "," ") strMOTO = Replace(strMOTO, " "," ") ほらよ、これで、4つOKだよ。 いくらなんでもそんなにスペース入れないだろう。 でも、5つ入れたら? そこまで面倒見切れないよ・・・わかったよ、ループで回しますよ。 10回も回せばいいでしょ。 For rCNT=1 To 10 '複数スペースを最大10までカット(1つに)する strMOTO = Replace(strMOTO, " "," ") Next それで、安心したの?もしかして? いいだろ、10個以上スペースなんて入れないよキーワードに。 じゃ、こんな夢見る女性が居たら? 私は、高学歴か高収入かマンション持っているか次男坊のどれかを検索したいのです。 検索条件には(or検索で) 高学歴 高収入 マンション 次男 の4つで検索をかけました。 OR検索だったので、未来の彼氏候補が500人も見つかっちゃった。 サスガのお姉ちゃんもここからは多くて選びきれないので、 とりあえず、高収入かマンション持っている人にしたいので、 高学歴と次男のキーワードを消して、下記の条件で検索をかけました。 高収入 マンション ↑※ ↑※ あれ、なんか検索結果がおかしい?なぜでしょう? 高学歴 高収入 マンション 次男 これを操作する時、アナタなら?どうしますか? DELやBSで 高収入 マンション とキレイにカットしてくれればいいけど □高収入□マンション□ と、前後にスペースを残してカットしてしまいました。 (あと、スペースで上書きする人も希少だけど居たりする、スペースで消す?) □高収入□マンション□ を作成した、分解処理で分解すると、頭のスペースに反応してしまうんですね。 さて、どうしましょうか? Trim関数で前後のスペースをカットすればいいんだろ(半分キレぎみ) strMOTO = Trim(strMOTO) で、いいんでしょ。/* * 4.作成した、キーワード分解処理 */
" 背が高い お金持ち 高学歴 マンション " ・頭にスペースあり、最後にスペースあり ・全角スペース□で区切られていたり、 ・スペース2個や4個で区切られている、 そんなデータに対応するために 作成した流れ ^^^^^^^^^^^^ 前後のスペースを取り除くためTrimを使用する strMOTO = Trim(strMOTO) 全角スペース□を半角スペースにReplace関数で置換する strMOTO = Replace(strMOTO, " "," ") スペースn個を1つのスペースにする<br> For rCNT = 1 To 10 '複数スペースを最大10までカット(1つに)する strMOTO = Replace(strMOTO, " "," ") Next その後、Split関数を使用して、スペース指定で配列を作成する strBOX = Split(strMOTO, " ") と、こんな感じで、スペース区切りのキーワードを作成してます。 あとは、 For i = 0 To UBound(strBOX) などで、SQL文を作成すればOKかなぁ。 http://www.ken3.org/cgi-bin/test/test081-2.asp で、テストできます。遊んでみてください。/* * 5.終わりの挨拶 </HTML> */
今回は、 キーワードの分解処理に挑戦してみました。 Split関数を使用するのですが、その前に、データをキレイにするのに手間取りました。 Split単: http://www.ken3.org/cgi-bin/test/test024-2.asp (Splitのみ全角SP不可) 途中 : http://www.ken3.org/cgi-bin/test/test081-1.asp (スペースn個未対応) 最終版 : http://www.ken3.org/cgi-bin/test/test081-2.asp (前後スペース、対応) で、テストできます。遊んでみてください。 もっと、想定外の操作ってあったりするけど、 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。
ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]
まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。
次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません
広告:
DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く
VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]