Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: BESTIMMTE Zeilen aus txt lesen

BESTIMMTE Zeilen aus txt lesen
16.07.2008 15:02:00
Andreas
Hallo Forum,
weiß jemand wie man mittels VBA DIREKT BESTIMMTE Zeilen einer txt-Datei auslesen kann?
Die Variante Zeile für Zeile zu lesen, nach Kriterium X zu prüfen und dann evtl zu verwenden, ist mir bekannt. Ich suche nach einer Möglichkeit beim Lesen in einer txt-Datei die zu lesende und bereits bekannte ZeilenNr direkt angeben zu können ohne vorher sämtliche anderen Zeilen lesen zu müssen.
Geht das? Wenn ja wäre es eine große Hilfe.
Vielen Dank im Voraus,
Andreas B.

Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: BESTIMMTE Zeilen aus txt lesen
16.07.2008 16:22:08
Tino
Hallo,
hier mal eine einfache Funktion,
an diese übergibst du die Zeilennummer und den Pfad + Dateiname, als Rückgabe bekommst du die Textzeile.

Public Function ZeileLesen(ZeilenNr As Long, DateiPfad As String) As String
Dim DateiNr As Integer
Dim Zeile As String
Dim ZeilenNr2 As Long
DateiNr = FreeFile
Open DateiPfad For Input As #DateiNr
Do Until EOF(DateiNr)
Line Input #DateiNr, Zeile
ZeilenNr2 = ZeilenNr2 + 1
If ZeilenNr2 = ZeilenNr Then
ZeileLesen = Zeile
Close #DateiNr
Exit Function
End If
Loop
Close #DateiNr
End Function


Gruß Tino

www.VBA-Excel.de


Anzeige
AW: BESTIMMTE Zeilen aus txt lesen
16.07.2008 16:45:00
Andreas
Hallo Tino,
danke für die Antwort. Aber wie beschrieben suche ich jedoch nach einer Methode mit der ich direkt eine bestimmte Zeile auslesen kann ohne sämtliche vorherigen txt-Zeilen lesen zu müssen.
Hintergrund: Ich habe sehr viele und sehr große txt-Dateien aus denen ich sehr viele Zeilen auslesen muß.
Wenn das Programm nun für jede auszulesende Zeile vorher alle vorherigen Zeilen durchforsten muß, benötigt das viel zu viel Zeit.
Ich suche also eine Methode bestimmte Zeilen direkt auszulesen.
Geht das?
Gruß,
Andreas B.

Anzeige
AW: BESTIMMTE Zeilen aus txt lesen
16.07.2008 17:17:00
Tino
Hallo,
hier noch eine ohne schleife, vieleicht ist die ja schnell genug?!

Public Function Lese_Zeile(ByVal sFilename As String, Zeile As Long) As String
Dim F As Integer
Dim sInhalt As String
Dim meTxt() As String
' Existiert die Datei ?
If Dir$(sFilename, vbNormal)  "" Then
F = FreeFile
Open sFilename For Binary As #F
sInhalt = Space$(LOF(F))
Get #F, , sInhalt
meTxt = Split(sInhalt, vbCrLf)
Lese_Zeile = meTxt(Zeile - 1)
Erase meTxt
Close #F
End If
End Function


Gruß Tino

Anzeige
AW: BESTIMMTE Zeilen aus txt lesen
16.07.2008 21:13:57
Uduuh
Hallo,
das ist so ziemlich das lahmste, was geht.
Mein Test mit einer .txt mit ca. 590.000 Zeilen und Lesen des 100.000sten Datensatzes: 14,4s. Per Schleife 0,05s.
Gruß aus’m Pott
Udo

Hab ich doch geschrieben!!!! oT
16.07.2008 21:49:00
Tino
.

AW: Hab ich doch geschrieben!!!! oT
16.07.2008 22:39:43
Uduuh
Hallo,
sollte nur ne Ergänzung sein.
Bei so vielen Zeilen exponiert sich das anscheinend. Mien Test: ca 300x schneller. Anscheinend frisst die Split-Funktion die Performance. Wenn man also weiß, in welcher Zeile der Wert ist, einfach durchrennen. Selbst wenn man suchen muss, ist der sequenzielle Vergleich sehr schnell.
Gruß aus’m Pott
Udo

Anzeige
mit Schleife doppelt so schnell!!!
16.07.2008 20:23:00
Tino
Hallo,
habe dies jetzt mal getestet und ein und dieselbe Datei 50.000-mal, eine bestimmte Zeile eingelesen.
Ergebnis, die erste Funktion mit der Schleife ist ca. doppelt so schnell wie die ohne Schleife!
Version 1 mit Schleife: 00:00:14
Version 2 ohne Schleife: 00:00:26
Gruß Tino

www.VBA-Excel.de


Anzeige
AW: mit Schleife doppelt so schnell!!!
16.07.2008 21:41:01
andy027
Hallo Tino,
nochmals vielen Dank für Deine Antworten !!
Ich hatte gehofft, dass es eine Möglichkeit gibt, mit der man mit geringstem Zeitaufwand die gewünschte txt-Zeile direkt liest ohne alle vorhergehenden Zeilen zeitaufwendig lesen zu müssen. Die txt-Datei komplett in ein array einzulesen (also Deine Version 2) um dann das entsprechende array-Element auszulesen, scheitert bei mir daran, dass die txt-Dateien im Extremfall zu groß sind und Speicherplatz-Probleme entstünden.
Mir bleibt noch der Weg die auszulesenden Zeilen zu sortieren, um sie dann mit einmaligem Durchlaufen der txt-Datei auszulesen, was jedoch aufgrund der Struktur etwas aufwendiger ist und die Code-Lesbarkeit darunter leidet...
Vielleicht weiß doch noch jemand eine einfache Lösung ?
Grüße aus Wuppertal,
Andreas B.

Anzeige
Ich hatte auch mal das Problem ...
16.07.2008 22:27:32
Backowe
Hi,
... eine Logdatei mit ca. 15 bis 20 Millionen Zeilen zu bearbeiten. Ich habe zuerst aus der Logdatei die relevanten Zeilen ausgelesen und in eine seperate bruchteilgroße Datei geschrieben.
VBA-Code:
Sub TextdateiAuslesen()
Dim a
a = Shell("cmd /c findstr suchbegriff Textdatei.txt > BereinigteTextdatei.txt", vbHide)
End Sub

Anzeige
Hinweis
16.07.2008 23:21:49
Tino
Hallo,
Bei dieser Verwendung muss man beachten, den Pfad DOS-kompatiblen anzugeben.
Also in der so genannten Kurzschreibweise, VBA Code zu finden über Google.
Dachte einfach es sollte noch erwähnt werden, sonst funktioniert dies bei manschen Lesern hier im Forum nicht.
Gruß Tino

http://www.VBA-Excel.de


Anzeige
AW: Hinweis
17.07.2008 07:59:05
Andreas
Vielen Dank an alle !!
Gruß,
Andreas B.

AW: Hinweis, geschlossen
18.07.2008 16:41:02
done
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Bestimmte Zeilen aus einer TXT-Datei mit VBA auslesen


Schritt-für-Schritt-Anleitung

Um bestimmte Zeilen aus einer Textdatei (txt) in Excel mittels VBA auszulesen, kannst Du die folgende Funktion verwenden. Diese ermöglicht es, direkt eine bestimmte Zeilennummer anzugeben, ohne alle vorherigen Zeilen lesen zu müssen:

Public Function ZeileLesen(ZeilenNr As Long, DateiPfad As String) As String
    Dim DateiNr As Integer
    Dim Zeile As String
    Dim ZeilenNr2 As Long
    DateiNr = FreeFile
    Open DateiPfad For Input As #DateiNr
    Do Until EOF(DateiNr)
        Line Input #DateiNr, Zeile
        ZeilenNr2 = ZeilenNr2 + 1
        If ZeilenNr2 = ZeilenNr Then
            ZeileLesen = Zeile
            Close #DateiNr
            Exit Function
        End If
    Loop
    Close #DateiNr
End Function

Um die Funktion zu nutzen, übergib einfach die gewünschte Zeilennummer und den Pfad zur Datei.


Häufige Fehler und Lösungen

  1. Fehler: Datei nicht gefunden

    • Stelle sicher, dass der Pfad zur Textdatei korrekt ist und die Datei existiert. Verwende die absolute Pfadangabe.
  2. Fehler: Zeilennummer außerhalb des Bereichs

    • Überprüfe, dass die angegebene Zeilennummer innerhalb der tatsächlichen Zeilenanzahl der Datei liegt.
  3. Performance-Probleme

    • Bei sehr großen Dateien kann das Einlesen von Zeilen sehr lange dauern. In solchen Fällen könnte die Implementierung einer alternativen Methode erforderlich sein.

Alternative Methoden

Wenn die oben genannte Methode nicht schnell genug ist, kannst Du die findstr-Funktion in VBA verwenden, um spezifische Zeilen zu filtern:

Sub TextdateiAuslesen()
    Dim a
    a = Shell("cmd /c findstr suchbegriff Textdatei.txt > BereinigteTextdatei.txt", vbHide)
End Sub

Diese Methode verwendet die Windows-Befehlszeile, um nur die relevanten Zeilen in eine neue Datei zu schreiben. Achte darauf, den Pfad im DOS-kompatiblen Format anzugeben.


Praktische Beispiele

Angenommen, Du möchtest die 100. Zeile aus einer Datei namens Daten.txt auslesen:

Sub BeispielAuslesen()
    Dim Ergebnis As String
    Ergebnis = ZeileLesen(100, "C:\Pfad\zu\Deiner\Datei\Daten.txt")
    MsgBox Ergebnis
End Sub

Für die Verwendung von findstr könnte der Code so aussehen:

Sub BeispielFindstr()
    Call TextdateiAuslesen
    MsgBox "Die relevanten Zeilen wurden in BereinigteTextdatei.txt geschrieben."
End Sub

Tipps für Profis

  • Speichermanagement: Bei großen Dateien kann es sinnvoll sein, den Inhalt in kleinere Abschnitte zu verarbeiten, um Speicherprobleme zu vermeiden.
  • Debugging: Nutze Debug.Print, um Zwischenergebnisse anzuzeigen und Fehlerquellen schneller zu identifizieren.
  • Leistungsoptimierung: Überlege, ob eine Kombination von vba line input und vba read text file line by line für Deine spezifische Anwendung sinnvoll ist.

FAQ: Häufige Fragen

1. Kann ich mehrere Zeilen gleichzeitig auslesen? Ja, Du kannst die Funktion anpassen, um ein Array von Zeilennummern zu akzeptieren und die entsprechenden Zeilen zurückzugeben.

2. Funktioniert das auch in Excel 2010? Ja, die vorgestellten Methoden sind mit den meisten Excel-Versionen kompatibel, darunter Excel 2010 und neuer.

3. Was ist der Unterschied zwischen den beiden vorgestellten Methoden? Die erste Methode liest die Datei Zeile für Zeile, während die findstr-Methode direkt in der Kommandozeile nach bestimmten Begriffen sucht und nur die relevanten Zeilen ausgibt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige