- ベストアンサー
VB2005 配列から要素を検索する方法
- VB2005入門者のための、配列から要素を検索する方法について解説します。
- 配列の中で指定した要素を検索し、一致すれば処理を行うプログラムを組みたい場合の方法を説明します。
- 具体的なコードとして、VB2005での配列検索の処理方法を紹介します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
hoge_id生成ロジックはこのままでは無理ですね hoge_no(1)のA14で hoge.txtの4行目のPOINT,A ,A14 ,GHIJを使ってしまいます 次のループでReadLIneした際には5行目のPOINT,A ,A15 ,GHIJがLineに読み込まれます したがって hoge_id(2)のA14を見つける事は出来なくなりファイルの最後まで行ってしまいます ご希望のデータの生成をしたいのであれば hoge_noをキーにしてループをまわす方法になりそうです for n=0 to hoge_no.Length -1 Dim reader1 As New System.IO.StreamReader("C:\hoge.txt", System.Text.Encoding.Default) Do Until reader1.EndOfStream line = reader1.ReadLine() If (line.Contains("POINT")) Then field = line.Split(",") If ((field(1).Trim = hoge_name(n)) And _ (field(2).Trim = hoge_no(n))) = True Then hoge_id(i) = field(7) ReDim Preserve hoge_id(0 To i) ' Reader1.Close() Exit do End If End If Loop Reader1.Close() Next といった具合でしょう
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
現象の再現できるデータと処理コードを提示いただけませんか? ついでに anserやhoge_idの期待する結果と実際の結果もあるとアドバイスしやすいかと思います
補足
ありがとうございます。 再現データを転載します。又期待する結果は以下の通りです。 [配列に格納したい] hoge_id[0]にA11列の “ABCD” hoge_id[1]にA14列の”GHIJ” hoge_id[2]にA14列の”GHIJ” hoge_id[3]にA15列の”GHIJ” hoge_id[4]にA18列の”ABCD” ↓HOGE.TXTの内容↓ POINT,A ,A10 ,ABCD POINT,A ,A11 ,ABCD POINT,A ,A13 ,ABCD POINT,A ,A14 ,GHIJ POINT,A ,A15 ,GHIJ POINT,A ,A16 ,ABCD POINT,A ,A18 ,ABCD AUTH,A ,A11 AUTH,A ,A14 N AUTH,A ,A14 M AUTH,A ,A15 AUTH,A ,A18 ↑ コ コ マ デ ↑ ↓データ↓ Dim reader As New System.IO.StreamReader(“C:\hoge.txt”, System.Text.Encoding.Default) Dim Vmax As Long = 0 Dim line As String Dim field() As String Dim hoge_name(Vmax), hoge_no(Vmax) As String Dim hoge_id(Vmax) As String Dim hoge_noSdel As Short = 0 Do Until reader.EndOfStream line = reader.ReadLine() field = line.Split(",") If field(0) = "AUTH" Then hoge_name(Vmax) = field(1).Trim() hoge_noSdel = field(2).Trim().IndexOf(" ") If hoge_noSdel = -1 <> True Then hoge_no(Vmax) = field(2).Remove(hoge_noSdel) Else hoge_no(Vmax) = field(2).Trim() End If Vmax = Vmax + 1 ReDim Preserve hoge_no(0 To Vmax), hoge_name(0 To Vmax) End If Loop reader.Close() Dim reader1 As New System.IO.StreamReader(“C:\hoge.txt”, System.Text.Encoding.Default) Dim i As Long = 0 Dim j As Long Do Until reader1.EndOfStream line = reader1.ReadLine() If (line.Contains("POINT")) Then field = line.Split(",") If (field(1).Trim = hoge_name(i) = True And field(2).Trim = hoge_no(i)) = True Then hoge_id(i) = field(7) i = i + 1 ReDim Preserve hoge_id(0 To i) End If End If Loop For j = 0 To UBound(hoge_id, 1) - 1 reader.Close() Next AUTH列に[A14NとA14M]が存在しますが、それぞれA14とみなし、且つきちんと14はふたつ存在させたいのです。 どうかよろしくお願いします。
- redfox63
- ベストアンサー率71% (1325/1856)
hoge_nameとhoge_noの中身の設定はどのようになっているのでしょう Dim hoge_name as String() = {"A","A","B","B","A"} Dim hoge_no as String() = {"A00","A01","A02","A03","A03" } ならご希望の処理が可能なように思います
補足
見ていただきありがとうございます。 困り果てて、重複するhoge_nameとhoge_noを削除し 配列に入れなおしたら事態が悪化してしまいました。 hoge_name hoge_noはいずれも配列(上限は変動。動的配列というのでしょうか)に {"A","A","B","B","A"}及び{"A00","A01","A02","A03","A03" }と なっております。 どうぞよろしくお願いします。
お礼
その発想が浮かびませんでした。。。 もう一度頭から読み直すのですね。 本当にありがとうございました!