Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0611: Schnell die Anzahl der Zeilen in einer Textdatei zählen

 von 

Beschreibung 

Um die Anzahl der Zeilen einer Textdatei festzustellen, ist ein Auslesen der Datei unumgänglich. Gleichwohl kann der Vorgang erheblich beschleunigt werden, wenn die Datei in Blöcken ausgelesen wird. Damit können auch große Files in akzeptabler Zeit analysiert werden

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

keine

Download:

Download des Beispielprojektes [2,79 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Projekt1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Textfeld "Text1"
' Steuerelement: Schaltfläche "Command1"


'--------------------------------------------------------------------
'     Zeilen aus einer Textdatei auslesen  peter.k.sauer@web.de
'
'     um die Anzahl der Zeilen einer Textdatei festzustellen, ist ein
'     Auslesen der Datei unumgänglich. Gleichwohl kann der Vorgang
'     erheblich beschleunigt werden, wenn die Datei in Blöcken aus-
'     gelesen wird. Damit können auch grosse Files in akzeptabler Zeit
'     analysiert werden
'---------------------------------------------------------------------

Option Explicit

Private Sub Command1_Click()
    'Beispiel für eine praktische Anwendung
    
    Dim Path As String
    Dim z As Long
    
    Path = Text1
    
    Me.MousePointer = vbHourglass
    z = GetLinesFromTextFile(Path)
    Me.MousePointer = vbDefault
    
    MsgBox z & " Zeilen"
End Sub

Public Function GetLinesFromTextFile(Path As String) As Long
'zählt die LinesCount einer Textdatei, die Datei muss vorhanden sein

   Dim FNr As Integer
   Dim FileLength As Double
   Dim BytesRead As Double
   Dim ByteToRead As Long
   Dim s As String
   Dim LinesCount As Long
   
      'ist die Datei leer
      If FileLen(Path) = 0 Then
         Exit Function
      End If
   
      'Block zum Auslesen, 64K
      ByteToRead = 256& * 256&
      'eine Pipe zuweisen
      FNr = FreeFile
      'Datei binär öffnen
      Open Path For Binary As #FNr
      'Dateilänge feststellen
      FileLength = LOF(FNr)
      
      'Blockweise auslesen
      Do
         If FileLength = BytesRead Then
            'alles ausgelesen
            Exit Do
         ElseIf (FileLength - BytesRead) < ByteToRead Then
            'den letzten Rest bestimmen
            ByteToRead = FileLength - BytesRead
         End If
         
         'Variable bereitstellen in Blockgrösse
         s = Space(ByteToRead)
         'Block einlesen
         Get #FNr, BytesRead + 1, s
         'LinesCount in Subroutine feststellen
         LinesCount = LinesCount + GetLinesFromString(s)
         'wie weit wurde bereits eingelesen
         BytesRead = BytesRead + ByteToRead
      Loop
      'der Zähler muss um 1 erhöht werden
      LinesCount = LinesCount + 1
      
      'war das letzte Zeichen ein Trenner ?
      s = Space(1)
      Get #FNr, FileLength, s
      If s = Chr(10) Then
         'ja, letzte Zeile nicht gefüllt
         LinesCount = LinesCount - 1
      End If
      Close FNr
      
      'Wert an Function
      GetLinesFromTextFile = LinesCount
End Function

Private Function GetLinesFromString(s As String)
' Zeilenumbrüche in einem String zählen,
' es wird nur der LineFeed ausgewertet

   Dim i As Long, j As Long, z As Long
   
      i = 1
      Do
         'suche nach Zeilentrenner
         j = InStr(i, s, Chr(10))
         If j = 0 Then
            'nix (mehr) da
            Exit Do
         End If
         'add
         z = z + 1
         'neue Position
         i = j + 1
      Loop
      
      'Wert an Function
      GetLinesFromString = z
End Function
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 6 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Junior am 13.01.2009 um 16:06

Private Function GetLinesFromString(s As String)
' Zeilenumbrüche in einem String zählen,
' es wird nur der LineFeed ausgewertet

GetLinesFromString = Len(s) - Len(Replace(s, Chr(10), ""))
End Function

Kommentar von Knurzel am 16.07.2005 um 19:05

..ok habs jetzt schon so gelößt:

Function fncZeilen(ByVal strFile As String) As Long
Dim fsoObject As Scripting.FileSystemObject
Dim tsrLineCount As Scripting.TextStream
fsoObject = CreateObject("Scripting.FileSystemObject")
fncZeilen= 0
tsrLineCount = fsoObject.OpenTextFile(strFile, Scripting.IOMode.ForReading, True)
Do While Not tsrLineCount.AtEndOfStream
tsrLineCount.ReadLine()
fncZeilen = fncZeilen+ 1
Loop
End Function

Kommentar von Knurzel am 16.07.2005 um 18:11

..hat jemand das schon vb.net fähig gemacht?

Kommentar von Chief Justice am 10.11.2004 um 10:43

Super

Kommentar von Filip am 27.10.2004 um 10:38

Funktioniert Super!

Kommentar von Moritz am 01.04.2004 um 17:44

hat sehr gut geklappt ;)