任意の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)
このような関数を組み合わせて、抽出&検索するのだろうな。と思っていますが、どのように組み合わせてソースを書いたらいいのか判らず困っております。どなたか教えていただけないでしょうか?
長くなってしまいましたが、よろしくお願い致します。
うーーん いきなり出てくる変数が多いですね。
>MaxRec = TREC ゼロクリア?
>Text1.Text = HMemo(TREC) 配列の最初?
>Text2.Text = HGain(TREC)
>If HFurigana(i) = serData Then 右辺左辺とも今までどこにも…
まーとりあえずワイルドカード(*)を使いたい場合は、
Like 演算子を使うか正規表現とか。
あと仕様を全部知らないので今のままで良いのか分かりませんが、
テキストファイルから文字列検索したいだけなら、
Input # ステートメント直後に検索したほうが…
インプットファイルの容量を知りませんが、
メモリ(配列)に全件ためておくのは、ちょっと怖い。
老婆心とは思いますが念のため。
「一次元配列を部分一致で絞り込む」のが目的であれば、
VB6のFilter関数を使う事ができます。
とはいえ、あまり高度な検索を行わせる事はできませんので、
okuさんの回答にあるような手法を用いた方が無難でしょう。
okuさん。魔界の仮面弁士さん。ありがとうございます。
>If HFurigana(i) = serData Then 右辺左辺とも今までどこにも…
Hfuriganaを書くのを忘れてました。配列は全部で12個あります。
プログラムを始めて間もないですが、PC歴はある程度長いので、確かにメモリに全部ためておくのは、怖いような気はしてました。でも手法がわかりません。okuさんの忠告は今後の参考にさせていただきます。
結局、Filter関数で検索する事ができました。
絞込みする手法がまだ思い浮かびませんが、検索した後、配列に入るので、自分の頭で考えてやってみようと思います。
また、わからない事がありましたら、質問するかもしれませんが、よろしくお願いします。どうもありがとうございました。
解決のチェック入れ忘れました。
編集 削除見たところ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
Sayさん。ありがとうございました。
おっしゃる通り、CSVのカード型データベースです。
それに検索機能を付けるだけ。という単純なものです。
単純ですが、プログラミングを初めてばかりでは、なかなか難しいです。
DAOでデーターベースの作成はすでに、試してみました。ADOは試していません。
ただ、その結果が重かったのです。
「データバインドの様に標準で備わってるVBの機能を利用してるからじゃないか」と推測しております。
検索の機能以外は完成しましたので、なんとか、検索を出来るようにしようと頑張ってる最中です。
ただ、Filterによる検索は出来たのですが、絞込みができません。
okuさんの「Input # ステートメント直後に検索したほうが…」
構文の書き方が調べてみましたが、わかりません。
この方法をご存知でしたら、お教え願えないでしょうか?
検索、絞込みが難しいようでしたら、DAO/ADOを使用する方法を考えてみようと思います。
よろしくお願いいたします。
>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
こんなものでどうでしょう?
okuさん。どうもありがとうございます。完成しました!
結局、違う手法を使い、絞込みはしない方法で完成できました。
皆さんのご協力がなかったら、もっと時間が掛かっていたと思います。
プログラミングを始めたばかりですので、まだまだわからない事だらけです。
また、できない事があったら、質問するかもしれませんが
その時はよろしくお願いいたします。