Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Daten lesen aus einer Textdatei

Begonnen von MartinHan, September 11, 2024, 21:04:00

⏪ vorheriges - nächstes ⏩

MartinHan

Hi,

ich bin heute in eine böse Falle getappt, die ich dem Forum mitteilen möchte um daraus zu lernen.
Es ist jetzt nicht die Erfindung des Rades, ich würde mich auch als erfahrener VB-Entwickler bezeichnen, aber manchmal bleibt man an kleinen Dingen hängen und ist auch immer wieder überrascht.

Ich wollte 3 Zeilen aus einer Textdatei lesen, die zur Steuerung meiner Anwendung dienen sollen.
Ich habe eine Textdatei angelegt, dort die Daten eingegeben, dann einen Button angelegt, der dann das übliche Coding auslöste. Filescriptingobjekt...usw.
Aber als Ergebnis bekam ich Daten, die gar nicht in der Datei standen, bzw. sie standen da mal in einer früheren Version drin.
Wo kommen die her??? Aus welchem Cache werden die geholt???

Dann habe ich die Datei umbenannt...gelöscht, neu angelegt...Neustart...nichts.
Früher waren in der Datei mal 2 Zeilen gewesen, jetzt sind es 3 und nach der zweiten Zeile mit den alten Daten kam die Fehlermeldung, ich hätte über über das Ende des Files weiter lesen wollen...

Ich hatte ganz ehrlich bis dahin noch keinen Tropfen angerührt, war aber kurz davor das zu ändern.

Dann stieß ich auf dieses Coding mit opentextfile , das ich bis dato noch nicht kannte:

Dim folder, strpfad, txtpfad As String
Dim tstxtfile As Scripting.TextStream
Dim z As String
Set fso = New Scripting.FileSystemObject
strpfad = application.CurrentProject.path
If InStr(strpfad, "DbAdcServer") > 0 Then
    folder = Mid(strpfad, 1, InStr(strpfad, "DbAdcServer") + 10)
End If
txtpfad = folder & "\stammdatei.txt"
Set tstxtfile = fso.OpenTextFile(txtpfad, ForReading, False, TristateMixed)
With tstxtfile
    Do Until .AtEndOfStream
        z = .ReadLine
        MsgBox .line & ":" & z
    Loop
.Close
End With

Das System ging gar nicht in die Do Until Schleife rein, sondern stieg sofort aus.
Ich hatte schon den Forumsbeitrag mit der Frage formuliert, da kam mir eine Ahnung.Offenbar war die Datei selnbst nicht da Problem, aber deren Inhalt!
Ich öffnete die Datei, plazierte den Cursor vor dem ersten Wort in der 1. Zeile, speicherte und schon lief es, alle drei Zeilen kamen...

Es gibt in txt Dateien offenbar eine Art Cursor, ab dem VB quasi weiterliest und nach der manuellen Eingabe der drei Zeilen stand der Cursor wohl am Ende der Datei, daher der Fehler mit dem Weiterlesen nach dem Ende.

Die Frage ist jetzt, kann man erzwingen, das die Datei immer direkt von Anfang gelesen wird? Also quasi  den Cursor ganz an den Anfang setzen?

Danke für einen Tip

Martin
Es gibt nichts gutes, außer, man tut es! EK

MzKlMu

#1
Hallo,
Access kann auch txt Dateien direkt lesen. Entweder importieren oder verlinken. Code braucht es dazu keinen. Der gezeigte Code kommt mir aber für Access unbekannt vor. Du musst bei Access auch zwischen VB und VBA unterscheiden.
Ich habe eine Textdatei angelegt, dort die Daten eingegeben,Es stellt sich auch die Frage. warum Du da eine Textdatei anlegst. Warum nimmst Du nicht gleich eine Accesstabelle ?

PS:
Die erste Zeile mit Dim ist falsch. Nur die letzte Variable (txtpfad) ist String, die anderen beiden sind Variant.
Wenn Du String willst, muss dies auch zugewiesen werden.
Dim folder As String, strpfad As String, txtpfad As String
Gruß Klaus

PhilS

#2
Zitat von: MartinHan am September 11, 2024, 21:04:00Es gibt in txt Dateien offenbar eine Art Cursor, ab dem VB quasi weiterliest und nach der manuellen Eingabe der drei Zeilen stand der Cursor wohl am Ende der Datei, daher der Fehler mit dem Weiterlesen nach dem Ende.
Ich kann dir zwar noch nicht sagen, was die Ursache für das von dir beobachtete, seltsame Verhalten ist, aber deine Vermutung hier ist so nicht korrekt.
Der Lese-Cursor der Datei hängt an der geöffneten Datei-Instanz. D.h. deinem TextStream-Objekt. Wo der Cursor in irgendeiner anderen Instanz der Datei (z.B. deinem Texteditor) ist, spielt hier keine Rolle. Der Texteditor hat vermutlich seinen Stream auch längst wieder geschlossen, nachdem er erstmalig die Datei gelesen hat.

Für am wahrscheinlichsten halte ich es, dass der Dateipfad in deinem Code nicht auf die Datei gezeigt hat, die du eigentlich einlesen wolltest, sondern auf eine andere.

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Bitsqueezer

Hallo,

nein, einen Cursor in Textdateien gibt es nicht.

Du öffnest die Datei mit "TristateMixed", was wohl eine veraltete Variante von "TristateDefault" ist und den Wert -2 haben sollte. Siehe Doku: https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/opentextfile-method

Wie sich das mit den Daten erklärt, kannst Du nur in Deiner Systemumgebung herausfinden, ein paar Ausgaben der Variableninhalte sollte Dir Aufschluss geben.

Das "Lesen nach Dateiende" könnte dagegen mit der Datei selbst zusammenhängen, es gibt Textdateien, die mit einer BOM beginnen, ein Code, der dem Editor mitteilt, daß es sich um eine Unicode-Datei handelt, die bekanntermaßen 2 Bytes pro Zeichen verwenden, während ASCII nur ein Byte verwendet. Wenn man das im falschen Modus öffnet, wird die falsche Anzahl Bytes eingelesen und ggf. auch falsche Inhalte, die dann aber eher wirr aussehen sollten.
Je nachdem, mit welchem Editor Du dann eine Textdatei öffnest und wieder speicherst, ändert dieser u.U. die Codierung.

Am besten ist es, Du verwendest einen Editor wie Notepad++, bei dem Dir die Codierung in der Fußzeile angezeigt wird (sofern Notepad++ diese ermitteln kann, ohne BOM ist es nur geschätzt am Inhalt). Die Codierung kannst Du mit Notepad++ auch konvertieren und gezielt im gewünschten Format speichern.
Dein Code wiederum muß das ebenfalls widerspiegeln, also nicht einfach Default verwenden, sondern gezielt angeben, ob Unicode oder ASCII.

Meiner Erinnerung nach funktioniert es mit Unicode am besten mit ADO Filestreams. Gibt genug Codebeispiele da draußen.
Aber nicht Copy/Paste, erst Doku lesen und verstehen und es an die eigenen Bedürfnisse anpassen.

Gruß

Christian




MartinHan

Hallo,

ich bedanke mich herzlich für die guten Ratschläge und werde es testen.

Martin
Es gibt nichts gutes, außer, man tut es! EK