2016-05-07 11 views
1

こんにちはすべてのコードは2つのテキストファイルの内容を比較する方法であり、ファイル内のレコードに対しては問題なく動作しますが、ファイルには多くの行(80000個)非常に非常に遅く、私はそれを受け入れることができません。親切に私にあるアイデアを教えてください。Vb.net大きなテキストファイルを比較する方法

Public Class Form1 

Const TEST1 = "D:\a.txt" 
Const TEST2 = "D:\b.txt" 
Public file1 As New Dictionary(Of String, String) 
Public file2 As New Dictionary(Of String, String) 
Public text1 As String() 
Public i As Integer 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    'Declare two dictionaries. The key for each will be the text from the input line up to, 
    'but not including the first ",". The valus for each will be the entire input line. 

    'Dim file1 As New Dictionary(Of String, String) 
    'Dim file2 As New Dictionary(Of String, String) 
    'Dim text1 As String() 
    For Each line As String In System.IO.File.ReadAllLines(TEST1) 
     Dim part() As String = line.Split(",") 
     file1.Add(part(0), line) 

    Next 

    For Each line As String In System.IO.File.ReadAllLines(TEST2) 
     Dim part() As String = line.Split(",") 
     file2.Add(part(0), line) 
    Next 

    ' AddText("The following lines from " & TEST2 & " are also in " & TEST1) 

    For Each key As String In file1.Keys 

     If file2.ContainsKey(key) Then 
      TextBox1.Text &= (file1(key)) & vbCrLf 
      MsgBox(file2(key)) 
      Label1.Text = file1(key) 
     Else 
      TextBox2.Text &= (file1(key)) & vbCrLf 
     End If 
    Next 
    text1 = TextBox1.Lines 
    IO.File.WriteAllLines("D:\Same.txt", text1) 
    text1 = TextBox2.Lines 
    IO.File.WriteAllLines("D:\Differrent.txt", text1) 

End Sub 

答えて

2

最初に私が変えるのは、辞書の使用です。私はハッシュセットを使用します。 See HashSet versus Dictionary

次に、私はReadAllLinesループを変更します。 ReadAllLinesはループを開始する前にメモリ内のすべての行を読み込みますが、ReadLinesはすべての行を読み込むわけではありませんが、すぐに行を開始することができます。
What's the fastest way to read a text file line-by-line?

第3のポイントは、読み込まれるファイルの順序を切り替えることです。最初にTEST2ファイル、次にTEST1を読み込みます。これは、TEST1行をロードしているときにfile2ハッシュセットにキーが含まれているかどうかを即座に確認して、見つからない文字列のリストに見つからない行が見つかったときに見つかった文字列のリストに追加します。

Dim TEST1 = "D:\temp\test3.txt" 
Dim TEST2 = "D:\temp\test6.txt" 
Dim file2Keys As New Hashset(Of String) 

For Each line As String In System.IO.File.ReadLines(TEST2) 
    Dim parts = line.Split(",") 
    file2Keys.Add(parts(0)) 
Next 

Dim listFound As New List(Of String)() 
Dim listNFound= New List(Of String)() 

For Each line As String In System.IO.File.ReadLines(TEST1) 
    Dim parts = line.Split(",") 
    If file2Keys.Contains(parts(0)) Then 
     listFound.Add(line) 
    Else 
     listNFound.Add(line) 
    End If 
Next 
IO.File.WriteAllText("D:\temp\Same.txt", String.Join(Environment.NewLine, listFound.ToArray())) 
IO.File.WriteAllText("D:\temp\Differrent.txt", String.Join(Environment.NewLine, listNFound.ToArray())) 
+0

ありがとう、私は私のチームに教えてくれます、ありがとう –

関連する問題