テキストファイルを読み込み、あいまい検索をさせて
例えば「ab」と入力して検索ボタンを押したらMsgBoxが出てきて
「"ab"を含む単語は×件あります」と表示して、
そのabを含んだ単語の一覧をCombo1かList1に表示させて
その単語のどれかを選んで検索を押すとその単語の和訳が出るというのを
つくりたいんですが、どういう風に命令を書いたらいいのかわかりません。
とりあえずヒントを下さると有り難いです。
環境と、読み込むテキストファイルの内容を書いて下さい。
すいません。
VB6.0で、テキストファイルは
able,〜できる、有能な
aboad,車内に、船内に
about,〜について、およそ
academy,専門学校
active,活動的な
action,行動
after,〜の後に
age,年齢
air,空気
という感じです。
>どういう風に命令を書いたらいいのかわかりません。
1つずつ整理せてみると良いかもしれません。
文字列関係の関数を知っていればイメージは沸くと思いますが。。
たとえば「able,〜できる、有能な」という文字列の中に「a」という文字列が
あるかないか判断したければ、「a」「b」「l」「e」「,」..とそれぞれの
文字が「a」と等しいか判断すれば良いわけで「ab」という文字列が
含まれているか判断したいときは、「ab」「bl」「le」「e,」「,〜」..と
いったものの中に等しいものがあるか判断する。以下検索したい文字の
文字数が増えても同じだと思います。これはLeft$やMid$を使えば実現すると
思います。しかしこれだと時間がかかりそうなのでSplitを使い配列の個数が
2個以上ならばその文字を含んでいる。というのもできそうですね。
まあ正攻法にせめるならば「正規表現」を使うと思いますが。。
こんな感じでどうでしょう。
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 & "件あります"
Split使うなら配列の個数が一個以上でOKでした。
かぶってしまいましたね・・・
曖昧検索はInStrで簡単にできると思います。
>その単語のどれかを選んで検索を押すとその単語の和訳が出る
SplitBuf = Split(TextBuf, ",", 2)
ここで、SplitBuf(0)に英単語が、SplitBuf(1)に和訳が入りますので、
あとは少し手を加えればOKです。
っ [like演算子]
>曖昧検索はInStrで簡単にできると思います。
そうだと思います。
まあやりかたはいくらでもあるといいたかっただけです。笑
サンプル作ってみました
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
みたいな
※現在、掲示板の容量不足(もしくは他の原因)で、
掲示板が正常に見えなくなってるかも。
あぁ・・・すみません・・・
どうも私が書いている間に必ず書き込みが・・・
そんなつもりは無いのに嫌なニュアンスになってしまいました。
申し訳ありませんでした。
良いサンプルも書き込まれてるので、
質問者さまも、私のは無視して下さい。
辞書的な使い方を考えているのなら、オンメモリレコードセットを使ってsortやfilterを駆使すると、より柔軟なシステムにできるかも。
さっそく回答ありがとうございます。
KeyWord="ab"となっていますがテキストはユーザ側が入力するので
ab固定ではないのですが、その場合どうなりますか?
>KeyWord="ab"となっていますがテキストはユーザ側が入力するので
>ab固定ではないのですが、その場合どうなりますか?
議論の対象にならないですよ。。
Aさんは変数ってわかりますようね。
その変数の中にユーザの入力した文字列を入れればいいですよ。
ビギナーさんのサンプルを実行してみたら、検索ボタンを2回押したら
メッセージボックスの件数が倍に増えたのですが、増えないようにするには
どうしたらいいですか?
「検索ボタン」を押下される時に
リストボックスを初期化しましょうね。
List1.clear
先程の質問のはできました。(検索ボタン
上の続きで、コンボボックス(リストボックス)から1つ単語を選び、
再検索ボタンを押すと右に和訳が出るというものを作りたいんですけど、
どう書いたらいいのかわかりません。。
>どう書いたらいいのかわかりません。。
ようするに自分で考えて作る気がないようですね。
まるで大学生の課題のようですね・・
>再検索ボタンを押すと右に和訳が出るというものを作りたいんですけど、
「右に」の意味が・・・
今度はあいまい検索じゃなくて完全一致検索するとか…。
いくら初心者でも『できません』『わかりません』じゃ話にならないのよ。
それなら作るのあきらめて下さい。プログラムなんて条件分岐の
繰り返しなんだから、ものすごく乱暴に言えば、If 文知ってれば、
『どう書いたらいいのかわかりません』ってのはただの手抜きです。
ゴリゴリ書いたらいいんです。ゴリゴリ。
すいません。。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で行数指定などをした方がいいのでしょうか?
>Combo1.text だと多分Combo1全体のテキストっていうことになると思うんですね。
「思うんですよね。」ではなく実際に試せばすぐわかると思いますが。。
ちなみにコンボボックスのTextプロパティは現在選択中の項目を指すので
行数指定(?)というような処理は必要ないと思います。
できました。いろいろありがとうございました。
ツイート | ![]() |