テキストファイルからのあいまい検索

解決


A  2006-02-24 19:08:27  No: 130380

テキストファイルを読み込み、あいまい検索をさせて
例えば「ab」と入力して検索ボタンを押したらMsgBoxが出てきて
「"ab"を含む単語は×件あります」と表示して、
そのabを含んだ単語の一覧をCombo1かList1に表示させて
その単語のどれかを選んで検索を押すとその単語の和訳が出るというのを
つくりたいんですが、どういう風に命令を書いたらいいのかわかりません。
とりあえずヒントを下さると有り難いです。


ビギナー  2006-02-24 19:33:32  No: 130381

環境と、読み込むテキストファイルの内容を書いて下さい。


A  2006-02-24 19:46:45  No: 130382

すいません。
VB6.0で、テキストファイルは

able,〜できる、有能な  
aboad,車内に、船内に
about,〜について、およそ
academy,専門学校
active,活動的な
action,行動
after,〜の後に
age,年齢
air,空気

という感じです。


え?  2006-02-24 20:20:04  No: 130383

>どういう風に命令を書いたらいいのかわかりません。
1つずつ整理せてみると良いかもしれません。
文字列関係の関数を知っていればイメージは沸くと思いますが。。
たとえば「able,〜できる、有能な」という文字列の中に「a」という文字列が
あるかないか判断したければ、「a」「b」「l」「e」「,」..とそれぞれの
文字が「a」と等しいか判断すれば良いわけで「ab」という文字列が
含まれているか判断したいときは、「ab」「bl」「le」「e,」「,〜」..と
いったものの中に等しいものがあるか判断する。以下検索したい文字の
文字数が増えても同じだと思います。これはLeft$やMid$を使えば実現すると
思います。しかしこれだと時間がかかりそうなのでSplitを使い配列の個数が
2個以上ならばその文字を含んでいる。というのもできそうですね。

まあ正攻法にせめるならば「正規表現」を使うと思いますが。。


ビギナー  2006-02-24 20:31:29  No: 130384

こんな感じでどうでしょう。

    Dim Path As String
    Dim FP As Long
    Dim KeyWord As String
    Dim TextBuf As String
    Dim SplitBuf() As String
    
    Path = App.Path & "\TestTextFile.txt"
    KeyWord = "ab"
    FP = FreeFile
    
    Open Path For Input As #FP
    Do While Not EOF(FP)
        Line Input #FP, TextBuf
        SplitBuf = Split(TextBuf, ",", 2)
        If InStr(1, SplitBuf(0), KeyWord, vbTextCompare) <> 0 Then
            List1.AddItem SplitBuf(0)
        End If
    Loop
    Close #FP
    
    MsgBox "「""" & KeyWord & """を含む単語は" & List1.ListCount & "件あります"


え?  2006-02-24 20:35:51  No: 130385

Split使うなら配列の個数が一個以上でOKでした。


ビギナー  2006-02-24 20:40:44  No: 130386

かぶってしまいましたね・・・
曖昧検索はInStrで簡単にできると思います。

>その単語のどれかを選んで検索を押すとその単語の和訳が出る
SplitBuf = Split(TextBuf, ",", 2)
ここで、SplitBuf(0)に英単語が、SplitBuf(1)に和訳が入りますので、
あとは少し手を加えればOKです。


ガッ  2006-02-24 20:50:55  No: 130387

っ [like演算子]


え?  2006-02-24 20:54:00  No: 130388

>曖昧検索はInStrで簡単にできると思います。
そうだと思います。

まあやりかたはいくらでもあるといいたかっただけです。笑


ガッ  2006-02-24 20:57:17  No: 130389

サンプル作ってみました

dim cnt as long
dim ff  as integer
dim s_w as string
dim s_j as string
ff=freefile
open "hoge.txt" for input as ff
    do until eof(ff)
        input #ff,s_w,s_j:if s_w like "*ab*" then cnt=cnt+1
    loop
close ff

みたいな

※現在、掲示板の容量不足(もしくは他の原因)で、
  掲示板が正常に見えなくなってるかも。


ビギナー  2006-02-24 21:46:50  No: 130390

あぁ・・・すみません・・・
どうも私が書いている間に必ず書き込みが・・・
そんなつもりは無いのに嫌なニュアンスになってしまいました。
申し訳ありませんでした。

良いサンプルも書き込まれてるので、
質問者さまも、私のは無視して下さい。


Say  2006-02-24 22:02:14  No: 130391

辞書的な使い方を考えているのなら、オンメモリレコードセットを使ってsortやfilterを駆使すると、より柔軟なシステムにできるかも。


A  2006-02-24 22:48:50  No: 130392

さっそく回答ありがとうございます。
KeyWord="ab"となっていますがテキストはユーザ側が入力するので
ab固定ではないのですが、その場合どうなりますか?


え?  2006-02-24 22:55:47  No: 130393

>KeyWord="ab"となっていますがテキストはユーザ側が入力するので
>ab固定ではないのですが、その場合どうなりますか?
議論の対象にならないですよ。。


まあまあ、そういわずに  2006-02-25 00:01:04  No: 130394

Aさんは変数ってわかりますようね。
その変数の中にユーザの入力した文字列を入れればいいですよ。


A  2006-02-25 00:26:39  No: 130395

ビギナーさんのサンプルを実行してみたら、検索ボタンを2回押したら
メッセージボックスの件数が倍に増えたのですが、増えないようにするには
どうしたらいいですか?


まあまあ、そういわずに  2006-02-25 00:42:43  No: 130396

「検索ボタン」を押下される時に
リストボックスを初期化しましょうね。
List1.clear


A  2006-02-25 00:56:57  No: 130397

先程の質問のはできました。(検索ボタン

上の続きで、コンボボックス(リストボックス)から1つ単語を選び、
再検索ボタンを押すと右に和訳が出るというものを作りたいんですけど、
どう書いたらいいのかわかりません。。


え?  2006-02-25 01:10:30  No: 130398

>どう書いたらいいのかわかりません。。
ようするに自分で考えて作る気がないようですね。
まるで大学生の課題のようですね・・

>再検索ボタンを押すと右に和訳が出るというものを作りたいんですけど、
「右に」の意味が・・・


特攻隊長まるるう  2006-02-25 01:12:45  No: 130399

今度はあいまい検索じゃなくて完全一致検索するとか…。

いくら初心者でも『できません』『わかりません』じゃ話にならないのよ。
それなら作るのあきらめて下さい。プログラムなんて条件分岐の
繰り返しなんだから、ものすごく乱暴に言えば、If 文知ってれば、
『どう書いたらいいのかわかりません』ってのはただの手抜きです。
ゴリゴリ書いたらいいんです。ゴリゴリ。


A  2006-02-25 01:27:56  No: 130400

すいません。。VB始めたばかりなので調べてもさらにわからなくなってしまって…。

>再検索ボタンを押すと右に和訳が出るというものを作りたいんですけど、
コンボボックス・再検索ボタン・ラベル(和訳表示)という画面配置なんです。

>コンボボックス(Combo1)から1つ単語を選び、再検索ボタン(Command3)を押す

Private Sub Command3_Click()
Dim i As Integer
 Label4.Caption = ""
 For i = 1 To KEN
   If ENG(i) = Combo1.Text Then
   Label4.Caption = JPN(i)
   Exit Sub
  End If
End Sub

Combo1.text だと多分Combo1全体のテキストっていうことになると思うんですね。ListIndexで行数指定などをした方がいいのでしょうか?


え?  2006-02-25 01:41:31  No: 130401

>Combo1.text だと多分Combo1全体のテキストっていうことになると思うんですね。
「思うんですよね。」ではなく実際に試せばすぐわかると思いますが。。
ちなみにコンボボックスのTextプロパティは現在選択中の項目を指すので
行数指定(?)というような処理は必要ないと思います。


A  2006-02-25 02:01:16  No: 130402

できました。いろいろありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加