2016-08-26 34 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

將行導入數據庫表(兩列,一行爲行號,第三行爲VARCHAR/NVARCHAR以容納行內容),並使用數據庫查找使用SQL的重複項。然後您可以向用戶顯示重複的行號。 (你問的速度,對不對?) –

回答

0

如果你堅持飼養過程(更新lblProcessCountApplication.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

這個簡單的改變做到了!謝謝。一份近60萬行的文件非常快。 – Acavier