vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Dateisystem · Dateien lesen/schreiben   |   VB-Versionen: VB615.04.10
Eine Textdatei rückwärts einlesen

Dieser Tipp zeigt, wie man eine Textdatei über kleine Umwege von hinten nach vorne einlesen kann.

Autor:   Dennis HemkenBewertung:     [ Jetzt bewerten ]Views:  14.747 
gadgets.hemken.orgSystem:  Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Eine Textdatei kann man leider nicht direkt von hinten nach vorne lesen. Manchmal ist das ein Problem. Bleiben wir beim Paradebeispiel, Logging. Bei Logging möchte man meist die neusten Einträge einer Protokolldatei (also die letzten) zuerst lesen und sich dann zu den ältesten vorarbeiten.

Eine solche Datei könnte folgendermaßen aussehen:

Logging                   Value        Date          Status           NochnWert
LG-00-abc                 54872        19.03.2010    OK		      klausmaus
LG-09-HALLOabc            00100        20.03.2010    OK		      hansfranz
PQ-77-MoinServus          00000        21.03.2010    Failed	      nickklick
OK-09-Xyz                 00100        30.03.2010    OK		      spassmaus
FG-59-Lollo               00100        01.04.2010    OK		      hippipipi

Eine Methode, die man wahrscheinlich nutzt, wenn man mal eben schnell etwas programmieren muss, damit es einfach nur funktioniert. Man macht einfach die Ausgabe Schleife des, mit den Lines versehenen Arrays Rückwärts:

For i = Ubound(arrFileLines) to LBound(arrFileLines) Step -1
    Debug.Print arrFileLines(i)
Next i

Das ist aber nicht schön, wenn man das Array mehrmals nutzen möchte, oder sogar an andere Funktionen übergeben muss.

Deshalb habe ich hier zwei Varianten, eine werdet ihr bestimmt kennen und schon das ein oder andere Mal genutzt haben, die andere wohl eher nicht.

Variante 1:

Public Function ReadFileBackward_V1( _
  ByRef arrFileLinesTurn() As String, _
  ByVal strFile As String, _
  ByVal blnWithHeader As Boolean)
 
  Dim arrFileLines() As String
  Dim lngCount As Long
  Dim lngBackward As Long
  Dim lngForward As Long
  Dim lngSize As Long
  Dim objFSO As Object
  Dim objFile As Object
 
  ' Fehlerbehandlung aktivieren
  On Error GoTo ErrHandler
 
  ' Laufparameter für das Redimensionieren des Arrays arrFileLines
  lngCount = 0
 
  ' Verweis auf das FileSystemObject erstellen
  Set objFSO = CreateObject("Scripting.FileSystemObject")
 
  ' Existiert die Datei überhaupt?
  If objFSO.FileExists(strFile) Then
    ' Datei zum Lesen öffnen
    Set objFile = objFSO.OpenTextFile(strFile, 1)
 
    Do Until objFile.AtEndOfStream
      ' Array redimensionieren
      ReDim Preserve arrFileLines(lngCount)
      ' Zeile einlesen und in das Array speichern
      arrFileLines(lngCount) = objFile.Readline
      ' Erhöhung des Laufparameter
      lngCount = lngCount + 1
    Loop
    objFile.Close
 
    ' Laufparameter für das Redimensionieren des Arrays arrFileLinesTurn
    lngForward = 0
 
    If blnWithHeader = False Then
      ' Array auf die gleiche Größe redimensionieren
      ReDim Preserve arrFileLinesTurn(UBound(arrFileLines))
      lngSize = LBound(arrFileLines)
    Else
      ' Array auf die gleiche Größe -1 redimensionieren
      ReDim Preserve arrFileLinesTurn(UBound(arrFileLines) - 1)
      lngSize = LBound(arrFileLines) + 1
    End If
 
    For lngBackward = UBound(arrFileLines) To lngSize Step -1
      ' Array füllen
      arrFileLinesTurn(lngForward) = arrFileLines(lngBackward)
      ' Erhöhung des Laufparameter
      lngForward = lngForward + 1
    Next
  End If
 
ErrHandler:
  ' Objekte zerstören
  Set objFile = Nothing
  Set objFSO = Nothing
End Function

Variante 2:

' Diese Funktion benötigt das .NET Framework 1 oder höher !!!
Public Function ReadFileBackward_V2( _
  ByRef arrFileLinesTurn() As String, _
  ByVal strFile As String, _
  ByVal blnWithHeader As Boolean)
 
  Dim lngForward As Long
  Dim strTmp As String
  Dim sysColStack As Object
  Dim objFSO As Object
  Dim objFile As Object
 
  ' Fehlerbehandlung aktivieren
  On Error GoTo ErrHandler
 
  ' Verweis auf das FileSystemObject erstellen
  Set objFSO = CreateObject("Scripting.FileSystemObject")
 
  ' Existiert die Datei überhaupt?
  If objFSO.FileExists(strFile) Then
    ' Datei zum Lesen öffnen
    Set objFile = objFSO.OpenTextFile(strFile, 1)
    ' System.Collections.Stack erstellen
    Set sysColStack = CreateObject("System.Collections.Stack")
 
    Do Until objFile.AtEndOfStream
      ' Zeile einlesen und in das Array speichern
      sysColStack.push objFile.Readline
    Loop
    ' Datei schließen
    objFile.Close
 
    ' Laufparameter für das Redimensionieren des Arrays arrFileLinesTurn
    lngForward = 0
 
    ' Array auf die Größe des Stacks redimansionieren
    ReDim arrFileLinesTurn(IIf(blnWithHeader = True, _
      sysColStack.Count, sysColStack.Count - 1))
 
    Do Until sysColStack.Count = IIf(blnWithHeader = True, 0, 1)
      ' Array füllen
      arrFileLinesTurn(lngForward) = sysColStack.pop
      ' Erhöhung des Laufparameter
      lngForward = lngForward + 1
    Loop
  End If
 
ErrHandler:
  ' Objekte zerstören
  Set objFile = Nothing
  Set objFSO = Nothing
End Function

Aufrufbeispiel:

Dim arrFileLinesTurn() As String
Dim blnWithHeader As Boolean
Dim strFile As String
Dim i As Long
 
strFile = "C:\log.txt"
 
' mit oder ohne erste Zeile
blnWithHeader = False
Call ReadFileBackward_V1(arrFileLinesTurn, strFile, blnWithHeader)
For i = 0 To UBound(arrFileLinesTurn)
  Debug.Print arrFileLinesTurn(i)
Next i
 
Call ReadFileBackward_V2(arrFileLinesTurn, strFile, blnWithHeader)
For i = 0 To UBound(arrFileLinesTurn)
  Debug.Print arrFileLinesTurn(i)
Next i