配列を部分一致で絞込みしたい

解決


あき  2004-01-21 22:36:36  No: 111505  IP: [192.*.*.*]

任意の1次元の配列を部分一致で検索し、ヒットしたレコードだけを抽出したいのですが、思ったように動作しません。
テキストファイルを下記のソースで読み込み表示はできています。
Open FileName For Input As #1
    Do Until EOF(1)
      MaxRec = MaxRec + 1
      Input #1, HMemo(MaxRec), HGain(MaxRec),‥‥
      Loop
Close #1
MaxRec = TREC

Text1.Text = HMemo(TREC)
Text2.Text = HGain(TREC)
-----------------------------
これが私の書いた検索のソースです。
検索はできますが、完全一致になってしまいます。また何故か判らないのですが、* を付けた検索ができません。

For i = 1 To TotalRec
        If HFurigana(i) = serData Then
        End If
Next i

任意の配列を部分一致で検索し、検索したレコードを絞り込みしたいのですが、本やネットで私なりに調べ、試してみましたができませんでした。
tmpInt1 = InStr(HFurigana(i), serData)
tmpInt1 = StrComp(HFurigana(i), serData, vbTextCompare)
このような関数を組み合わせて、抽出&検索するのだろうな。と思っていますが、どのように組み合わせてソースを書いたらいいのか判らず困っております。どなたか教えていただけないでしょうか?
長くなってしまいましたが、よろしくお願い致します。

編集 削除
oku  URL  2004-01-21 23:12:02  No: 111506  IP: [192.*.*.*]

うーーん  いきなり出てくる変数が多いですね。
>MaxRec = TREC                    ゼロクリア?
>Text1.Text = HMemo(TREC)         配列の最初?
>Text2.Text = HGain(TREC)
>If HFurigana(i) = serData Then   右辺左辺とも今までどこにも…
まーとりあえずワイルドカード(*)を使いたい場合は、
Like 演算子を使うか正規表現とか。
あと仕様を全部知らないので今のままで良いのか分かりませんが、
テキストファイルから文字列検索したいだけなら、
Input # ステートメント直後に検索したほうが…
インプットファイルの容量を知りませんが、
メモリ(配列)に全件ためておくのは、ちょっと怖い。
老婆心とは思いますが念のため。

編集 削除
魔界の仮面弁士  2004-01-22 02:41:47  No: 111507  IP: [192.*.*.*]

「一次元配列を部分一致で絞り込む」のが目的であれば、
VB6のFilter関数を使う事ができます。

とはいえ、あまり高度な検索を行わせる事はできませんので、
okuさんの回答にあるような手法を用いた方が無難でしょう。

編集 削除
aki  2004-01-22 20:59:28  No: 111508  IP: [192.*.*.*]

okuさん。魔界の仮面弁士さん。ありがとうございます。
>If HFurigana(i) = serData Then   右辺左辺とも今までどこにも…
Hfuriganaを書くのを忘れてました。配列は全部で12個あります。
プログラムを始めて間もないですが、PC歴はある程度長いので、確かにメモリに全部ためておくのは、怖いような気はしてました。でも手法がわかりません。okuさんの忠告は今後の参考にさせていただきます。
結局、Filter関数で検索する事ができました。
絞込みする手法がまだ思い浮かびませんが、検索した後、配列に入るので、自分の頭で考えてやってみようと思います。
また、わからない事がありましたら、質問するかもしれませんが、よろしくお願いします。どうもありがとうございました。

編集 削除
aki  2004-01-22 20:59:58  No: 111509  IP: [192.*.*.*]

解決のチェック入れ忘れました。

編集 削除
Say  2004-01-22 21:38:25  No: 111510  IP: [192.*.*.*]

見たところcsvファイルの絞込み検索のようですが、
より複雑な検索・絞込みをしたいなら、
DAO/ADOを使って、csvファイルをテキストデータベースとして開けば、
SQLを用いてかなり柔軟に検索・絞込みができます。

たとえばだいたいこんなかんじ。

    Dim daoDB As DAO.Database
    Dim daoRst As DAO.Recordset
    Dim strSQL As String
    Set daoDB = DBEngine.Workspaces(0).OpenDatabase( _
                App.Path, False, False, _
                "Text;DATABASE=" & App.Path & "\;HDR=NO")
    strSQL = "Select * from [Test#csv] As T1 "
    strSQL = strSQL & "Where T1.F1 = " & Text1.Text & " "
    Set daoRst = daoDB.OpenRecordset(strSQL)
    Do Until daoRst.NoMatch 
        List1.AddItem daoRst.Fields(1).Value
        List2.AddItem daoRst.Fields(2).Value
        List3.AddItem daoRst.Fields(3).Value
    End Loop
    daoRst.Close
    daoDB.Close
    Set daoRst = Nothing
    Set daoDB = Nothing

編集 削除
aki  2004-01-24 21:50:22  No: 111511  IP: [192.*.*.*]

Sayさん。ありがとうございました。
おっしゃる通り、CSVのカード型データベースです。
それに検索機能を付けるだけ。という単純なものです。
単純ですが、プログラミングを初めてばかりでは、なかなか難しいです。
DAOでデーターベースの作成はすでに、試してみました。ADOは試していません。
ただ、その結果が重かったのです。
「データバインドの様に標準で備わってるVBの機能を利用してるからじゃないか」と推測しております。
検索の機能以外は完成しましたので、なんとか、検索を出来るようにしようと頑張ってる最中です。
ただ、Filterによる検索は出来たのですが、絞込みができません。

okuさんの「Input # ステートメント直後に検索したほうが…」
構文の書き方が調べてみましたが、わかりません。
この方法をご存知でしたら、お教え願えないでしょうか?

検索、絞込みが難しいようでしたら、DAO/ADOを使用する方法を考えてみようと思います。
よろしくお願いいたします。

編集 削除
oku  URL  2004-01-25 00:27:59  No: 111512  IP: [192.*.*.*]

>Input # ステートメント直後に検索したほうが…
うーーん  そのままなんですが、
akiさんの仕様を満たしているか分かりませんが、
一応ソース書きますね。
Open FileName For Input As #1
    Do Until EOF(1)
        Input #1, HMemo, HGain,‥‥
        If InStr(HFurigana, "キーワード") > 0 Then
            MsgBox "見つかった!"
        End If
    Loop
Close #1
こんなものでどうでしょう?

編集 削除
aki  2004-01-26 20:59:02  No: 111513  IP: [192.*.*.*]

okuさん。どうもありがとうございます。完成しました!
結局、違う手法を使い、絞込みはしない方法で完成できました。
皆さんのご協力がなかったら、もっと時間が掛かっていたと思います。

プログラミングを始めたばかりですので、まだまだわからない事だらけです。
また、できない事があったら、質問するかもしれませんが
その時はよろしくお願いいたします。

編集 削除