2016-05-27 2 views
2

Ich muss ein Programm machen, liest. TXT-Dateien für eine Zeichenfolge und manipuliert die Daten, um verschiedene Ergebnisse zurückzugeben. Das Problem, das ich habe, ist mit dem Timing der Ausführung.VB.net - Schnellere Textbearbeitung/Speichern in Array

Dim OpenAnswerFile As New OpenFileDialog 
    OpenAnswerFile.Multiselect = True 
    Dim strFileName() As String '// String Array. 
    Dim tempStr As String = "" '// temp String for result. 
    Dim FileName As String 
    Dim Watcher As New Stopwatch 
    If OpenAnswerFile.ShowDialog = DialogResult.OK Then 
     Watcher.Restart() 
     For Each FileName In OpenAnswerFile.FileNames 

      strFileName = IO.File.ReadAllLines(FileName) 
      For Each myLine In strFileName 
       tempStr &= myLine & vbNewLine 
      Next 

     Next 
     Watcher.Stop() 
     Dim TimeToArrays = Watcher.Elapsed 
     Watcher.Reset() 
     '========================WRITE TO FILE 
     Dim file As System.IO.StreamWriter 
     file = My.Computer.FileSystem.OpenTextFileWriter("c:\test.txt", True) 
     Watcher.Restart() 
     file.Write(tempStr) 
     file.WriteLine(TimeToArrays) 
     file.WriteLine(Watcher.Elapsed) 
     Watcher.Stop() 
     file.Close() 

     '========================WRITE TO FILE 

    End If 

Ausführen dieser zu txt-Dateien-dictionary gestylt, von A bis Z, dauert etwa eine Minute, die ich eine Menge für insgesamt knapp über 1 MB-Dateien.

Gibt es eine Möglichkeit, den gesamten Prozess zu beschleunigen?

+0

Haben Sie versucht, die Dateien verketten, ohne sie alle in einem String zu speichern? –

Antwort

2

Versuchen Sie diesen Code - er läuft in 6,5 Sekunden auf fast 90 MB Dateien.

Änderungen an Ihrem Code kann wie folgt zusammengefasst werden:

die Dialog
  • prüfen und sie durchlaufen die Dateien nicht, bis dieser Teil der Routine abgeschlossen ist.

  • Verwenden Sie während der Lesevorgänge die Using...End Using, um die E/A effizient zu machen.

  • Verwenden Sie eine List(of String), um die Daten zu speichern, anstatt sie an einen String anzuhängen. Ich denke, dies ist aus Sicht des Speichermanagements effizienter. Es kann schnellere Wege geben, andere Sammlungen zu verwenden.

  • Verwenden Sie während des Schreibvorgangs Using...End Using, um die E/A effizient zu machen.

Hier ist der Code:

Sub DoItQuicker() 

    Dim OpenAnswerFile As New OpenFileDialog 
    OpenAnswerFile.Multiselect = True 
    Dim strFileName() As String '// String Array. 
    Dim strSingleFileContent As String 
    Dim strFileData As New List(Of String) 
    Dim FileName As String 
    Dim Watcher As New Stopwatch 

    'get user feedback 
    If OpenAnswerFile.ShowDialog <> DialogResult.OK Then 
     MessageBox.Show("Not OK") 
     Exit Sub 
    Else 
     strFileName = OpenAnswerFile.FileNames 
    End If 
    OpenAnswerFile.Dispose() 

    'read data 
    Watcher.Restart() 
    For Each FileName In OpenAnswerFile.FileNames 

     Using sr As New IO.StreamReader(FileName) 
      strSingleFileContent = sr.ReadToEnd 
      For Each line As String In strSingleFileContent.Split(vbLf) 
       strFileData.Add(line) 
      Next 
     End Using 

    Next 
    Watcher.Stop() 
    Dim TimeToArrays = Watcher.Elapsed 
    Debug.Print(Watcher.ElapsedMilliseconds) 

    'write data 
    Watcher.Restart() 
    Using sw As New IO.StreamWriter("D:\temp\out.txt") 
     For Each line As String In strFileData 
      sw.WriteLine(line) 
     Next 
     sw.WriteLine(TimeToArrays) 
     sw.WriteLine(Watcher.Elapsed) 
    End Using 
    Watcher.Stop() 
    Debug.Write(Watcher.ElapsedMilliseconds) 


End Sub 
+0

Ich habe es gerade getestet, und es lief bei 0.09s, runter von ~ 1m mit meinem Code. Vielen Dank. Aber ein Problem, dass ich diesen Code verwenden, ist, dass die Ausgabe jeden Buchstaben in einer eigenen Zeile speichert. Wie kann ich ein ganzes Wort pro Zeile speichern? – SpK

+0

Was ist ein Beispielinhalt jeder Datei? Ich habe einige Testdateien mit Tausenden von Zeilen von 'foo, bar' nur zum Testen erstellt. –

+0

https: // wir .tl/beABagB9cI Ich habe eine Datei in WeTransfer hochgeladen, damit Sie sehen, auf was ich es laufen lasse. Es funktioniert wirklich gut, es speichert nur die TXT-Datei durch Schreiben jedes Buchstaben in eine neue Zeile Edit: Es scheint auch 2 Leerzeilen nach jedem verarbeiteten Wort – SpK