2017-01-14 10 views
-1

私はvb.netを使用してテキストファイルを読み込み、一致するレコードがあるかどうかを確認し、そのレコードを取り出して書き込みます優れています。vb.net - r.peek()> = 0行= r.readline()

しかし、ピークループでは、ファイルの最後まで読み込みます。私は2つのピークループを持っています - 外側のピークループは項目を探し、それを見つけるために内側のループサーチを行います。

ピークループを停止し、外側ループが停止する場所を継続できますか?これは私のコードの例です。両方の検索ループの外側でforループを実行して、外側のループが停止する場所を続行しますが、どちらかが正しいとは限りません。おかげ

For i = 1 To t_idex 

      rder.BaseStream.Seek(0, IO.SeekOrigin.Begin) 
      rder.DiscardBufferedData() 

      Do While rder.Peek() >= 0 
       line = rder.ReadLine() 
       r_idx += 1 
       st_outer += 1 

       m = Mid(line, 3, 7) 
       P = Mid(line, 19, 7) 
       b= Trim(Mid(line, 34, 14)) 

       If Len(b) = 14 Then 
        Do While rder.Peek() >= 0 
         line2 = rder.ReadLine() 

         m2 = Mid(line2, 3, 7) 
         P2 = Mid(line2, 19, 7) 
         b2 = Trim(Mid(line2, 34, 14)) 

         If b = b2 Then 
          cnt_dups += 1 

         End If 

         r_idx += 1 
        Loop 
       End If 
       i = st_outer 
      Loop 

     Next 
+0

は、あなたがより良いあなたが欲しいものを説明することができますが達成するためにここに?何かを見つけるコードはどこですか?内側のループは、ファイルの終わりまで読み込みを行い、何かを見つけたらそのループを止める条件はありません。 – Steve

+0

なぜこれは複雑ですか?行を読んで、必要なものかどうか、ループを終了するか、ファイルの最後に到達するまで調べます。 – dbasnett

+0

@steveコードを更新しました。外側のループは、bのlenが14であることを発見します。内側のループに入る場合、外側のループがbのlenを見つける場所からファイル全体をループし、bとb2の一致があるときは両方のレコードを書き込みます(これを行うためのコードはまだ更新されていません)。ファイルの終わりまでこれを行います。その時点から何が起こるかは、外側のループに行き、途中で停止し、インクリメントして、外側のループがeofに完了するまで、次の検索を行うと想定されるときに、両方のループが実行され、完全に終了することです。あなたが私の言いたいことを知っていたらいいなあ – Johnseito

答えて

1

....これがあなたのために何をするか

Dim Lines() As String = File.ReadAllLines("SomeTextFile.txt") 

For LineIndex = 0 To Lines.GetUpperBound(0) 
    Dim Match1 As String = Mid(Lines(LineIndex).Trim, 34, 14) 
    If Match1.Length = 14 Then 
     For Each RemainingLine As String In Lines.Skip(LineIndex + 1) 
      Dim Match2 As String = Mid(RemainingLine.Trim, 34, 14) 
      If Match1 = Match2 Then 
       ' We have a duplicate... 
       DoSomething() 

       ' Resume outer loop 
       ' Comment this line to find all duplicates 
       ' Uncomment this line to short-circuit exit upon finding 
       '  the first duplicate 
       Exit For 
      End If 
     Next 
    End If 
Next 

参考資料を参照してください:

+0

コード例を提供していただきありがとうございます。それは美しく見え、ちょうど私が探しているものです。私が変更したことの1つは、あなたのコードが終了のためにファイルの終わりまでチェックしていないことに気付いたときに、それを取り出して、外側のループにstop変数を置き、そこからLineIndexを続行してください。それにもかかわらず、非常に有益なコード例でした。 – Johnseito

+0

あなたのコメントをいくつか解釈することができ、あなたが何を意味するのか理解したいと思っています。 – MrGadget

+0

私は3行しか追加していませんでしたが、Dim lines()の一番上にある、Dim stp_idxをInteger = 0として、LinIndex = 0のDim match1の下にstp_idx + = 1をmatch1 = match2、私は出口を取り出した後、内部ループの次のコードの後に​​私はLineIndex = stp_idx -1を追加しました。私は、最初の試合後に別の試合が見つかった場合に備えて、内側のループがファイルの最後に行くようにしました。そして、外側のループは中断したところからピックアップします。 :) – Johnseito

関連する問題