2016-08-26 25 views
2

私はさまざまなサイズのさまざまなインポートファイルを扱う会社で働いています。これらのファイルの事前チェックを開発して、重複する行を見つけて識別します(行全体がファイル内の別の行と一致する場合)。私はすでにこのコードを書いていますが、ファイルの行数が100,000を超えると、コードは実際に減速し始めます。このコードをより速く実行させ、コードをシンプルに保つにはどうすればよいですか?VB.NETはテキストファイル内に重複する行を見つける

Dim sr As New StreamReader(txtFile.Text) 
While Not sr.EndOfStream 
    i += 1 
    ' Save the header of the file if requested 
    If chkKeepHeader.Checked And i = 1 Then 
     sHLine = sr.ReadLine 
    End If 
    sLine = sr.ReadLine 

    ' Compare the current line with the previous lines read 
    If lstDistLines.Contains(sLine) Then 
     iDupCount += 1 
     lstDupLines.Add(i & "," & sLine) 
    Else 
     lstDistLines.Add(sLine) 
    End If 

    ' Update the display at regular intervals 
    If i Mod (50) < 1 Then 
     lblProcessCount.Text = i 
     Application.DoEvents() 
    End If 
End While 
sr.Close() 
sr.Dispose() 
sr = Nothing 
+0

dupsが見つかった場合は、それらを使用してください。カウントを維持する、他の何かをするなど?また、レビューを求めている場合は、http://codereview.stackexchange.comで一番上です。あなたができることはたくさんありますが、それはレビューサイトで一番いいと言えます:) – Codexer

+0

すべての重複した行は元の行番号とともにユーザーに報告する必要があり、元のファイルで簡単に見つかるようにする必要があります。私は別のファイルに重複した行を格納することでこれを行います。 – Acavier

+0

行をデータベース表にインポートします(2行、行番号の1列、3行目は行内容を保持するVARCHAR/NVARCHAR).DBを使用してSQLを使用して重複を検索します。次に、複製された行番号をユーザーに表示することができます。 (あなたはスピードを求めていましたか?) –

答えて

0

あなたは(多くの時間を取るlblProcessCountを更新してApplication.DoEvents())プロセスを追跡することを主張する場合は、行を格納するためにHashSetの代わりlstDistLinesを使用することができます。 HashSetでは重複は許可されませんが、項目が含まれているかどうかを確認するには、追加するアイテムの数にかかわらずほぼ同じ時間がかかります。

how to remove duplicate line from text file vb.net

+0

私はこれが好きですが、重複する行が無効なデータとして見えるという問題があります。ファイルをインポートする人は、重複した行をインポートファイルを作成した人に報告したいでしょう。 – Acavier

+0

@Acavier 'lstDupLines'リストを保持する必要があります。' lstDistLines'の型を 'List'から' HashSet'に変更するだけで、残りのコードをそのまま保つことができます。リンクは 'HashSet'のサンプル使用のためのものです – Slai

+0

それは簡単な変更でした!ありがとうございました。ほぼ600,000行のファイルが非常に高速になりました。 – Acavier

関連する問題