Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Datei mit VBA einlesen - vbCrLF / vbLF

Datei mit VBA einlesen - vbCrLF / vbLF
15.12.2022 11:45:38
Olaf
Hallo,
dieses Forum ist bei allen Excel Problemen mein erster Anlaufpunkt, hier finde ich immer eine Lösung - nur diesmal nicht, deshalb nun mein erster Beitrag...
zur Situation:
Ich muss bestimmte Zelleninhalte aus xml-Dateien extrahieren. D.h. bisher werden sie mit VBA zeilenweise eingelesen, dann geprüft ob die Zeile das richtige Tag enthält und wenn ja der Wert übernommen.
Das funktioniert soweit ganz gut wenn die Datei vbCrLF als Zeilenendezeichen enthält.
Aber bei vbLF als Trenner wird die gesamte Datei als eine Zeile erkannt, weshalb dann nichts extrahiert wird. Und es dauert eben, bis dann endlich alles eingelesen ist. Jetzt sind die Dateien auch noch in der Größe explodiert und bei 1,6 GB möchte ich sie nicht falsch öffnen.
bisheriges Vorgehen:

   Do While Not EOF(1)
Line Input #1, TextLine
Loop
Frage(n):
Was ist das beste Vorgehen, um Dateien in der Größe zu verarbeiten? (Und bitte nicht mit "nimm ein besser geeignetes Programm" antworten.)
Natürlich kann ich über

   Open "D:\MyDatei.txt" For Binary As #1
MyString = Input(LOF(1), #1)
CLOSE #1
MyString = Replace(MyString, Chr$(10), Chr$(13)&CHR$(10))
Open "D:\MyDatei.txt" For Output As #1
Write #1, MyString
CLOSE #1
den fehlenden CR einfügen, damit im Anschluss ein

   Line Input #1, TextLine 
funktioniert.
Aber was ist, wenn ich Dateien mal mit vbLf und mal mit vbCrLf erhalte? Wie kann ich in kurzer Zeit feststellen, welche Art von Zeilenenden die Datei enthält? Kann ich z.B. nur die ersten 1000 ZeiCHen einlesen (ohne vorher die ganze Datei gelesen zu haben) und in dem String nach vbCrLf suchen?
Im Moment erscheint mir alles so schwierig/unmöglich, dass ich dazu tendiere, vor dem Einlesen eine msgbox auszugeben, in der darauf hingewiesen wird, dass die Dateien Windows-Zeilenenden aufweisen müssen und man sie nochmals mit z.B. emEditor, Textpad8 o.ä. öffnen und ggf. ändern soll.
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datei mit VBA einlesen - vbCrLF / vbLF
15.12.2022 11:57:50
Der
Hallo,
hier zwei Möglichkeiten, die mir spontan einfallen:
Variante 1:
Zeichenweise in einen String einlesen, das vbCr verwerfen und bei Zeilenende (vbLf) sen String "abschließen" ... Rest wie bei Dir.
Variante 2:
Komplett in eine Variable einlesen und dann vbCR durch einen Leerstring ersetzen und dann mittels Split bei vbLf in eine Array-Variable lesen und diese abarbeiten.
Variante 1 wird vermutlich langsamer sein als Variante 2, evtl. aber aufgrund der Größe der Dateien besser. Müsste man ggf. testen.
Grüße
Michael
Anzeige
AW: Datei mit VBA einlesen - vbCrLF / vbLF
15.12.2022 12:17:14
volti
Hallo Olaf,
lies die Daten erst in ein Array. Da kannst Du den Trenner vorgeben und alles, u.U. auch schneller, per Array abarbeiten.
Hier ein Beispiel:
Code:


Sub Test() Dim iff As Integer, iZeile As Long Dim sDaten As String, sArr() As String, sFilename As String sFilename = "D:\MyDatei.txt" ' Daten in Array einlesen If Dir(sFilename) = "" Then Exit Sub iff = FreeFile() Open sFilename For Binary Access Read As iff sDaten = Space$(LOF(iff)) Get iff, , sDaten Close iff sArr = Split(sDaten, vbLf) ' Hier Trenner vorgeben For iZeile = 0 To UBound(sArr) ' mach was Next iZeile End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Datei mit VBA einlesen - vbCrLF / vbLF
16.12.2022 13:12:19
Olaf
Hallo Karl-Heinz,
ein Array als Lösung hatte ich schon mehrfach gelesen, mich aber davor gescheut, weil mir der Geschwindigkeitsvorteil nicht klar war. Die Lösung ist ja pfeilschnell! Im Moment trenne ich also mit vbLf und alles funktioniert. Wenn dann doch mal eine Datei mit Windows-Zeilenenden geliefert wird, hätte das Array nach dem Split nur einen Eintrag und daran könnte ich erkennen, dass der Split nochmals mit vbCrLf wiederholt werden muss. So komme ich weiter.
Eines ist klar: Ich werde nie wieder mit Line Input arbeiten!
Herzlichen Dank für die Hilfe!
Anzeige
AW: Datei mit VBA einlesen - vbCrLF / vbLF
16.12.2022 13:27:31
Daniel
Nur so als Tipp, weil ich XML gelesen habe:
Excel hat eine Funktion XMLFilter, mit der man die Werte ermitteln kann, die den gesuchten Tags zugeordnet sind.
Kennst du diese?
Vielleicht kannst du damit deine Aufgabe einfacher lösen.
Gruß Daniel
AW: Datei mit VBA einlesen - vbCrLF / vbLF
19.12.2022 15:16:45
Olaf
Hallo Daniel,
danke für den Hinweis. Ehrlich gesagt komme ich mit der Excel-internen Hilfe zu der Funktion nicht weiter - ob ich das aber überhaupt wollte ist mir noch gar nicht klar. Denn wenn ich eine XML-Datei in Excel öffne dauert das immer ewig, und wenn das Öffnen im Rahmen der Funktion genauso lange dauern würde, wäre die Sache schon alleine deshalb gestorben.
Der jetzige Weg funktioniert für die aktuellen Zwecke hervorragend, da kann ich mir kaum etwas besseres vorstellen ;-)
Gruß, Olaf
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Datei mit VBA einlesen: Umgang mit vbCrLF und vbLF


Schritt-für-Schritt-Anleitung

  1. Datei im Binärmodus öffnen: Verwende den folgenden Code, um eine Datei zu öffnen und den Inhalt in eine String-Variable einzulesen:

    Dim MyString As String
    Dim FilePath As String
    FilePath = "D:\MyDatei.txt"
    Open FilePath For Binary As #1
    MyString = Input(LOF(1), #1)
    Close #1
  2. Zeilenenden ersetzen: Um sicherzustellen, dass die Datei sowohl mit vbCrLF als auch mit vbLF funktioniert, ersetze das vbLF durch vbCrLF:

    MyString = Replace(MyString, vbLf, vbCrLf)
  3. Daten in ein Array einlesen: Nutze die Split-Funktion, um den String in ein Array zu trennen:

    Dim sArr() As String
    sArr = Split(MyString, vbCrLf)
  4. Daten verarbeiten: Iteriere über das Array, um die Daten weiter zu verarbeiten:

    Dim i As Long
    For i = LBound(sArr) To UBound(sArr)
       ' Datenverarbeitung hier
    Next i

Häufige Fehler und Lösungen

  • Fehler: Datei wird als eine Zeile erkannt
    Lösung: Stelle sicher, dass du die Zeilenenden korrekt umwandelst, indem du sowohl vbCrLF als auch vbLF behandelst.

  • Fehler: Programm wird langsam
    Lösung: Vermeide die Verwendung von Line Input für große Dateien. Nutze stattdessen die oben beschriebene Methode mit Arrays.


Alternative Methoden

  • Zeichenweise einlesen: Eine weitere Möglichkeit ist, die Datei zeilenweise einzulesen und dabei vbCr zu ignorieren:

    Dim TextLine As String
    Do While Not EOF(1)
       Line Input #1, TextLine
       ' Verarbeite TextLine
    Loop
  • XML-Daten filtern: Nutze die XMLFilter-Funktion von Excel, um gezielt die benötigten Werte aus XML-Dateien zu extrahieren.


Praktische Beispiele

Hier ist ein Beispiel für das Einlesen einer Datei und die Verarbeitung der Daten:

Sub ReadFileAndProcess()
    Dim MyString As String
    Dim sArr() As String
    Dim i As Long

    Open "D:\MyDatei.txt" For Binary As #1
    MyString = Input(LOF(1), #1)
    Close #1

    MyString = Replace(MyString, vbLf, vbCrLf)
    sArr = Split(MyString, vbCrLf)

    For i = LBound(sArr) To UBound(sArr)
        ' Hier kannst du den Wert von sArr(i) weiterverarbeiten
    Next i
End Sub

Tipps für Profis

  • Maximiere die Effizienz: Wenn du mit sehr großen Dateien arbeitest, überlege, die Daten in kleineren Blöcken zu verarbeiten, um die Speicherauslastung zu reduzieren.

  • Verwende Debugging: Nutze Debug.Print, um den Inhalt des Arrays während der Verarbeitung zu überprüfen.

  • Zugriff auf Windows-Benutzernamen: Mit Environ("USERNAME") kannst du den aktuellen Windows-Benutzernamen in eine Zelle schreiben.


FAQ: Häufige Fragen

1. Wie kann ich feststellen, welches Zeilenende in der Datei verwendet wird?
Du kannst die ersten 1000 Zeichen der Datei einlesen und nach vbCr oder vbLf suchen.

2. Gibt es eine Möglichkeit, die Verarbeitung zu beschleunigen?
Ja, indem du den Inhalt der Datei in ein Array einliest und anschließend mit Split arbeitest, kannst du die Geschwindigkeit erheblich steigern.

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