Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Einlesen von Textdateien mit "open for"

Betrifft: Einlesen von Textdateien mit "open for" von: Claus Ohlendorf
Geschrieben am: 12.08.2008 12:14:21

Hallo zusammen,

ich möchte aus einer 240MB grossen Textdatei die Zeilen raussuchen, die einen bestimmten String enthalten. Dazu habe ich mir unten aufgelistetes Makro geschrieben.

Ich weiss, dass jede Zeile in der Quelldatei mit einem Zeilenumbruch (im Word dieses P zeichen) beendet ist. Ich habe mir gedacht, jede Zeile einzeln in eine Variable zu lesen, diese zu untersuchen und dann eventuell in Datei 2 zu schreiben. Leider aber liest mir der Befehl "Line Input" die ganze Datei in die Variable ein (nicht 998 Zeichen sondern ewig viel mehr).

Wie muss ich das richtig machen, dass ich mein Ziel erreiche?

Vielen Dank für Eure Hilfe!

Gruss
Claus

Sub TxtEinlesen()

    Dim DateiName As String
    Dim OutputName As String
    Dim ZeilenInhalt As String
    Dim SuchText As String
    
    SuchText = "0835080563395000"
    
    Open "h:\temp\CCPR" For Input As #1
    Open "h:\temp\testCCPR" For Output As #2
    
    Do While Not EOF(1)
        Line Input #1, ZeilenInhalt
        Cells(1, 1) = Len(ZeilenInhalt) 'habe ich nur zu Testzwecken eingefügt
        
        
            If Len(ZeilenInhalt) > 16 Then 'sollte die Zeile weniger Zeichen enhalten als der
                                            Suchtext, gibts keinen Fehler

                For z = 1 To Len(ZeilenInhalt) - 16
                    If Mid(ZeilenInhalt, z, 16) = SuchText Then
                        Print #2, ZeilenInhalt
                        Exit For
                    End If
                Next z
            End If
    Loop
    Close #1
    Close #2
    
    
End Sub


  

Betrifft: AW: Einlesen von Textdateien mit "open for" von: Rudi Maintaire
Geschrieben am: 12.08.2008 12:59:17

Hallo,
das ist nicht nachvollziehbar.
Lad mal einen Schnippsel deiner Textdatei hoch.

Die Schleife For z= 1 to ...
brauchst du nicht. Schau dir mal die InStr-Funktion an.

Gruß
Rudi


  

Betrifft: AW: Einlesen von Textdateien mit "open for" von: Claus Ohlendorf
Geschrieben am: 12.08.2008 13:27:25

Servus Rudi,

sorry, das ist nicht möglich... Da könnte ich hier ziemlichen Ärger bekommen, wenn ich sensible Daten verschicke, da ich genau diese aus der Datei herauszufiltern ... Vielleicht kann ich Dir die gesuchte Info ja so geben?

Ich habe mal nachgeschaut: Die Zeilen werden im Text-File mit Ascii-Code 10 beendet. Scheinbar erkennt Line Input diesen Code nicht als Zeilenumbruch... Oder was meinst Du?

Die InStr-Funktion ist cool... Merci für den Tip!

Gruss
Claus


  

Betrifft: AW: Einlesen von Textdateien mit "open for" von: Claus Ohlendorf
Geschrieben am: 12.08.2008 13:45:48

Sali Rudi,

gemäss

http://de.wikibooks.org/wiki/VBA_in_Excel_-_Grundlagen:_Textimport

reicht Excel ein CHR(10) nicht aus... :-(((

Hmmm... also scheidet Excel wohl aus...

Gruss
Claus


  

Betrifft: AW: Einlesen von Textdateien mit "open for" von: Rudi Maintaire
Geschrieben am: 12.08.2008 14:31:14

Hallo,
versuchs mal ohne Line.

Input #1, Zeichenfolge

Gruß
Rudi


  

Betrifft: AW: Einlesen von Textdateien mit "open for" von: Claus Ohlendorf
Geschrieben am: 12.08.2008 14:53:34

Servus Rudi,

Danke für den Tip, aber das Ergebnis ist das gleich... Es wird die ganze Datei in eine Variable gelesen. Bei meinem Testfile gehts noch, aber wenn ich alle Datensätze nehme, wird wohl der Puffer überlaufen...

Gruss
Claus


  

Betrifft: AW: Einlesen von Textdateien mit "open for" von: Ramses
Geschrieben am: 12.08.2008 15:26:29

Hallo

Probiers mal so wenn ALLE Daten sofort eingelesen werden und in "Zeileninhalt" stehen

Dim tmpArray() as String

tmparray = split(ZeilenInhalt, vbcrlf)

Nun kannst du das Array von oben nach unten durchgehen. Die Datensätze sollten korrekt getrennt sein.

Option Explicit

Sub test()
    Dim myStr As String
    Dim tmpArr() As String
    Dim i As Integer
    myStr = "987897" & Chr$(10) & "987897" & Chr$(10) & "jljlkjlkj987897" & Chr$(10) & "8907897987" & Chr$(10) & "lkjlkjlkJKLJ" & Chr$(10) & "987897"
    tmpArr = Split(myStr, vbCrLf, -1)
    For i = 0 To UBound(tmpArr)
        Debug.Print tmpArr(i)
    Next i
End Sub


Gruss Rainer


  

Betrifft: AW: Einlesen von Textdateien mit "open for" von: Claus Ohlendorf
Geschrieben am: 12.08.2008 16:21:11

Servus Rainer,

so hatte ich mir das dann auch in etwa gedacht, als Konsequenz daraus, dass chr(10) nicht als Zeilenumbruch interpretiert wird. Allerdings befürchte ich, dass beim Einlesen der gesamten Datein in eine Variable, der Lesepuffer locker überschritten wird (Die GesamtDatei ist etwa 240MB gross)...

Gibt es eine Möglichkeit, die Datei eventuell direkt in einen Array einzulesen??? Hmmm...

Mal nachschauen...

Danke für den Tip!

Gruss
Claus


  

Betrifft: AW: Einlesen von Textdateien mit "open for" von: Ramses
Geschrieben am: 12.08.2008 16:52:11

Hallo

Probier mal folgendes

Sub readBigFile()
    funcImportTextFile "C:\vbcrlf.txt", vbCrLf
End Sub



Function funcImportTextFile(strFullPath As String, deLimiter As String) As Boolean
    'von Florian aus dem Herber Forum
    'modifiziert by Ramses
    'Verweis auf die Microsoft Scripting Runtime muss gesetzt sein
    On Error GoTo ErrHandler
    Dim tmpArr() As String
    Dim myFSO As Object
    Dim myFSOTs As Object
    Dim strActLine As String
    Dim i As Long, tmpCtr As Long
    Dim iRow As Long, iCol As Long
    Set myFSO = CreateObject("scripting.FileSystemObject")
    Set myFSOTs = myFSO.OpenTextFile(strFullPath, ForReading)
    Workbooks.Add 'Wird in eine neue Mappe importiert, kann geändert werden
    'Erste Reihe
    iRow = 1
    'Erste Spalte
    iCol = 1
    'Für den Anwender zum verfolgen
    tmpCtr = 1
    'einlesen starten
    Do Until myFSOTs.AtEndOfStream
        Application.StatusBar = "Datensatz " & tmpCtr & " wird gelesen"
        strActLine = myFSOTs.readline
        tmpArr() = Split(strActLine, deLimiter)
        For i = 0 To UBound(tmpArr)
            Cells(iRow, iCol) = tmpArr(i)
        Next i
        iRow = iRow + 1
        tmpCtr = tmpCtr + 1
        If iRow = Rows.Count Then
            iRow = 1
            iCol = iCol + 1
        End If
    Loop
    errExit:
    Application.StatusBar = False
    Exit Function
    
    ErrHandler:
    MsgBox Err.Number & vbCrLf & Err.Description
    Resume errExit
End Function


Im VB-Editor muss der Verweis auf die "Microsoft Scripting Runtime" gesetzt sein.

Allerdings befürchte ich dass bei 240 MB die 64536 Zeilen nicht ausreichen werden.
Daher habe ich noch die Umsetzung für die Spaltengetrennte Eintragung eingebracht.

Gruss Rainer


  

Betrifft: AW: Einlesen von Textdateien mit "open for" von: Anton
Geschrieben am: 12.08.2008 15:55:56

Hallo Claus,

versuch's mal so:

Public Sub b()  
  Dim fso, DieDatei
  Set fso = CreateObject("Scripting.FileSystemObject")  
  Dateiangabe = "e:\test.txt" 'anpassen
  SuchText = "wert" 'anpassen
  Set DieDatei = fso.OpenTextFile(Dateiangabe, 1, False)  
  Do While DieDatei.AtEndOfStream <> True    
    strZeile = DieDatei.ReadLine
    If InStr(1, strZeile, SuchText, vbTextCompare) <> 0 Then Debug.Print strZeile    
  Loop
  DieDatei.Close
End Sub  


mfg Anton


  

Betrifft: AW: Einlesen von Textdateien mit "open for" von: Claus Ohlendorf
Geschrieben am: 12.08.2008 16:28:13

Servus Anton,

das hat geklappt!!!! Endgeil... und mit einer affenartigen Geschwindigkeit! Super!!! Danke für die Hilfe!!!!

Gruss
Claus


  

Betrifft: Ich wusste ja dass ich langsam bin :-)... von: Ramses
Geschrieben am: 12.08.2008 16:54:19

Hallo

Sorry,... wollte nicht noch was drauflegen, aber wir hatten wohl den gleichen Ansatz
und ich muss den Browswer wohl öfter aktualisieren ;-)

Gruss Rainer


 

Beiträge aus den Excel-Beispielen zum Thema "Einlesen von Textdateien mit "open for""