Rubrik: Dateisystem · Dateien lesen/schreiben | VB-Versionen: VB6 | 27.12.10 |
Textdatei rückwärts einlesen Dieser Code zeigt, wie sich eine Textdatei sehr schnell rückwärts einlesen lässt. | ||
Autor: Dieter Otter | Bewertung: | Views: 13.677 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Hatten Sie auch schon einmal das Problem, dass Sie eine Textdatei nicht von vorne bis zum Ende, sondern genau umgekehrt auslesen mussten? Solange es sich um "kleinere" Dateien handelt, kann man die einzelnen Zeilen der Datei in ein String-Array auslesen und dieses dann rückwärts bearbeiten.
Wenn es sich dagegen um sehr große Dateien handelt (mehrere Mega-Bytes) ist diese Vorgehensweise nicht sehr performant, da man ja zunächst den gesamten Inhalt auslesen muss.
Nachfolgend stellen wir Ihnen einen Code vor, mit dem sich eine Textdatei beliebiger Größe rückwärts einlesen lässt, ohne dass hier der Arbeitsspeicher aufgrund der großen Dateigröße an seine Grenzen stösst.
Wir öffnen die Textdatei hierbei im Binary-Mode, navigieren via Seek-Methode an das Ende der Datei und lesen diese dann rückwärts in kleine Blöcke aus.
Dim sFile As String Dim F As Integer Dim nFilePos As Long Dim nBytes As Long Dim nSize As Long Dim sBuffer As String Dim sBufferOld As String Dim nPos As Long Dim sLine As String ' Blockgröße Const nBlockSize = 16384 sFile = "D:\MeineDatei.txt" ' Datei im Binary-Mode öffnen F = FreeFile Open sFile For Binary As #F ' Größe der Datei nSize = LOF(F) nFilePos = nSize nCount = 0 ' Solange einlesen, bis wir am Anfang der Datei angelangt sind Do While nFilePos > 1 ' Blockgröße bestimmen, die eingelesen werden soll nBytes = nBlockSize If nFilePos - nBytes < 1 Then nBytes = nFilePos nFilePos = nFilePos - nBytes + 1 ' Inhalt lesen sBuffer = Space$(nBytes) Seek #F, nFilePos Get #F, , sBuffer sBuffer = sBuffer & sBufferOld nPos = 0 Do ' nach Zeilenumbruch-Zeichen suchen nPos = InStrRev(sBuffer, vbCrLf) If nPos > 0 Then ' Zeile aus Block extrahieren sLine = Mid$(sBuffer, nPos + 2) sBuffer = Left$(sBuffer, nPos - 1) ' Zeileninhalt testweise in einer ListBox ausgeben List1.AddItem sLine End If Loop Until nPos = 0 If nPos > 0 Then sBufferOld = sBuffer Else sBufferOld = Mid$(sBuffer, nPos + 2) ' den Rest des Puffers ohne das erste Zeichen lesen End If Loop Close #F