2016-05-07 5 views
1

Привет всем. Ниже приведен код сравнения содержимого в двух текстовых файлах и отлично работает для записи в файлах, но моя проблема, когда файлы имеют много строк (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

Первое, что я бы изменил, это использование Словаря. Я бы использовал Hashset. See HashSet versus Dictionary

Тогда я бы изменил цикл ReadAllLines. ReadAllLines загружает каждую строку в памяти перед запуском цикла, в то время как ReadLines не читает все строки, но вы можете сразу начать работу с вашей линией.
См. What's the fastest way to read a text file line-by-line?

Третий пункт - это переключение порядка считываемых файлов. Сначала прочитайте файл TEST2, затем TEST1. Это связано с тем, что при загрузке строк TEST1 вы можете сразу проверить, содержит ли файл xHashset ключ и добавляет найденную строку в список найденных строк, в то время как строка не найдена в списке не найденных строк.

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

Большое вам спасибо, я научу свою команду, еще раз спасибо –

Смежные вопросы