Teil Einlesen von Ascii File (.dat, .txt, .csv)

Stefan_B1

Grünschnabel
Hallo liebe Community,

Problembeschreibung:
Es soll ein großes Ascii File nur zum Teil eingelesen werden. Die Größe ist das Problem => Das File liegt auf einem älteren (dos) Maschinenrechner. Das File soll regelmässig (ca jede Minute, falls eine Änderung des files registriert wird) eingelesen werden, jedoch wird nur jeweils die genannte "Änderung" benötigt.
Nun möchte ich, weil die Änderung sicher immer nur "angehängt" wird (also eine weitere Zeile beschrieben => Maschinenlog), jedoch nur die letzten Zeilen auslesen.
Diese sollen mit meinen bisher gesammelten Daten verglichen werden & die Änderung in meine neue Datenbank geschrieben werden.
Hauptproblem: Ich möchte den Maschinenrechner sowenig wie möglich "belasten", weil er durchaus andere Prozesse zu regeln hat, die wichtiger sind.
Also hoffte ich nur die letzten wenigen "kb" des Files "abzurufen", statt jede Minute das gesamte File einzulesen & dann doch nur die letzten "kb"/"Zeilen" zu verwerten.

Fragestellung:
Gibt es eine Funktion die mir erlaubt eine Datei nur zum Teil "vom Ende" weg einzulesen?
Mit den mir bekannten 'Open' funktionen wird doch immer das gesamte File geöffnet?

Lösungsansätze:
Folgend wie ich mir eine Lösung vorstellen könnte
1) Nur jeweils die letzten kb "laden" (Funktion in VB unbekannt)
2) Anweisung das File "abzuschneiden" ab xxx kb und die letzten xx kb auf meinen Rechenr lokal kopieren & von dort einlesen (Idee: mit batch-datei möglich falls nicht mit vb? wie?)

Beispielcode kann ich leider nicht liefern, weil ich bis jetzt nur mit Open arbeite, was in der Praxis leider nicht sein sollte (einlesen des gesamten files).

Hier noch ein Link zu einer gebräuchlichen VB-Prozedur: sie liest aber leider eben auch das gesamte File ein, und wertet es dann "von vorne" zeilenweise aus.
LINK

Der selbe Post von mir wie hier im office-loesung.de forum: LINK
 
Zuletzt bearbeitet:

deepthroat

Erfahrenes Mitglied
Hi.

Du müßtest die Datei im Random Modus öffnen, dann kannst du Blöcke von Daten an beliebigen Positionen lesen.

Allerdings mußt du dann die Zeilen wieder selbst zusammenbasteln.

Eine andere Möglichkeit wäre die Funktionen der C Bibliothek (fopen, fseek, fscanf) zu nutzen.

Gruß
 

Stefan_B1

Grünschnabel
Ich bin mir nicht sicher "die Lösung" gefunden zu haben, jedoch funktioniert es so wie folgt.

Frage zu Open: Lese ich mit der Open-Anweisung das gesamte File schon von der Festplatte, oder werden mir mit der Open-Anweisung erstmal die Dateiinformationen mitgeteilt?
Falls es sich lediglich um die Dateiinfos handelt sieht meine Lösung so aus, dass ich die Datei mit Open for Input öffne und dann den Zeiger auf ein bestimmtes Byte lenke & erst ab diesem Byte mit Line Input beginne.
Code:
Sub GetLastLines()

    Dim i As Integer
    Dim FN As Integer

    FN = FreeFile 'nächstes freies File
    ' i = 1 ' Nur spezielle Excel Zwecke

    FileToOpen = "C:\test.txt" 'Beispiel
    Open FileToOpen For Input As FN

    ' Mit Seek setze ich den Byte-Zeiger auf
    ' 1000 Bytes vor EndOfFile über LenghtOfFile
    Seek FN, LOF(FN) - 1000
        Do While Not EOF(FN)
            Line Input #1, Satz
            ' Cells(i, 1) = Satz
            ' i = i + 1
        Loop
    Close FN

End Sub
Anmerkung:
Die erste "Line" ist natürlich durch den "Abschnitt" an zufälliger Stelle unbrauchbar

Ich würde noch um eine Antwort zu oben genannter Frage zu "Open" bitte bevor ich das Thema abschließen kann
 

DrSoong

Iss was, Doc!
Open heißt ja öffnen, ist so wie wenn du z.B. eine Packung öffnest. Der Inhalt ist aber noch drin, du hast ja noch nichts herausgenommen.

Open reserviert also mal für das System den Dateizugriff mit allem was dazugehört (z.B.Windows-interne Sperren), die eigentliche Dateioperation wird aber erst mit z.B. Print, Put usw. durchgeführt.

Zu dem Thema kannst du dir auch diesen Kurs ansehen.


Der Doc!
 

Stefan_B1

Grünschnabel
das wollte ich hören. Danke für die verständliche Beschreibung mit der Schachtel :D

Der Kurs ist super, auf den bin ich auch schon hier gestoßen & mir direkt mal 2 Stunden Zeit genommen ihn grob durchzugehen (& mir zu merken wo die ein und anderen Tricks sind falls ich sie mal brauche)

Denke dann ist auch alles klar soweit!

Die Funktion wie von mir geschrieben funktioniert - welche Variablen jemand übergeben möchte in der praxis lass ich offen.