Hallo Reinhard,
danke für Deine Antwort.
Hallo Pauli,
Type Datensatz
Haupt As String * 36
Titl As String * 36
Inf1 As String * 26
Art As String * 2
usw.
das usw. kann ich nicht deuten, die komplette Type Deklaration
oder ist das Definition?, wäre da hilfreich.
das usw. steht da, weil es im Prinzip so weiter geht. Der ganze Datensatz besteht aus 13 einzelnen Variablen, die ich hier nicht alle aufführen wollte. Geschrieben hatte ich damals die Daten unter Windows 3.11. Wenn eine String-Variable mit z.B. Länge 35 deklariert war, ich aber nur ein Wort von 10 Zeichen Länge eingetragen hatte, fand ich in der gespeicherten Datei, die ich mir mit einem Hex-Editor (damals Debug) ansah, in den restlichen 25 Stellen statt Leerstellen (#20) irgendwelche Zeichen, die von vorherigen Einträgen stammten. So ist die Datei dann bis heute geblieben.
Wenn ich jetzt also die 35 Zeichen des Strings auslese, bekomme ich diesen Müll mit, es sei denn, ich lese nur die echte Länge, die ja im ersten Byte angegeben ist.
Ist das so rübergekommen, wie ich das meine?
Das Problem mit dem korrekten Lesen habe ich nun ja gelöst, indem ich zuerst die Variable mit ihren 36 Byte aus dem Datenfeld lese und dann mit Hilfe des 1. Byte die echte Länge bestimme. Mit der „Mid(…)“-Anweisung wird dann nur der gültige Text bestimmt.
Dieses Verfahren gilt dann für alle 13 Variablen des Datenfeldes.
Open Datei For Random As #1 Len = Len(Dsatz1)
Get #1, Posi, Dsatz1
Close #1
Irschendwie haste was gegen mein „binary“ *grien*
Nein, nur habe ich ausprobiert, daß das Lesen eines einzelnen Datensatzes (einer mit den 13 Textvariablen) aus dem Datenfeld mit der Angabe der Länge (len) funktioniert, die Länge len aber nicht bei „binary“ gilt.
btw, soll das i in Posi für Integer stehen? Bei langen Codes
macht es schon großen Sinn im Variablennamen den Typ
mitanzugegeben.
Das Posi soll eigentlich „Position“ heißen, also die Nummer des Datensatzes aus dem Feld. Das Wort war mir zu lang. Nicht sicher, ob „Pos“ ggf. ein Schlüsselwort ist (bei anderen Programmsprachen ist das eine Anweisung), habe ich das „i“ angehängt.
Bei sehr sehr großen Codes auch die Gültigkeit der variablen,
also
global, nur in dem Modul u.ä.
Wie auch immer, ich würde wenn schon das intPos benennen.
Siehe Google und ungarische Notation.
Das ist ein guter Tipp.
Meine Frage ist: gibt es eine elegantere Methode, einen String
mit seiner echten Länge aus einem Feld zu lesen. Meines
Wissens nach ist ein String immer so aufgebaut, daß die echte
Länge das 1. Zeichen darstellt (oder war das früher so, als
die Wortlänge noch begrenzt war?)
Wenn du selbst eine Textdatei mit zigmal einem deklarierten
Datensatz so brauchst du doch nicht die Länge der
Einzeldinger.
Das regelt sich doch wenn du analog wieder in eine Variable
einliest die als Datensatz deklariert wurde.
Das habe ich mir auch so gedacht. Aber vielleicht liegt das an dem Alter der Datei, die ich nach Excel übertragen habe. Sicherlich habe ich damals vergessen, den deklarierten Datenbereich zunächst zu leeren, bevor ich Daten dort eintrage. Heute passiert sowas sicherlich nicht mehr.
Annerster sieht der Fall aus wenn eine Textdatei vorliegt,
z.B.
aus TP mit deren „Regeln“.
Da muss man, ggfs. mit einem Hexeditor schauen wie die denn
strukturiert ist.
Ich erlebte da schon Fremddateien die hatten als Zeilentrenner
2mal Chr(13) und 1 mal Chr(10).
Da ging mein Auslesen schief da ich codiert hatte vbCRLF
zu beachten und beim Auslesen ggfs. „rauszuwerfen“.
Denn ein chr(13) blieb störend übrig.
Also ich rechne bei fremden Textdateien mit allem.
Zu deinem Anliegen. Bitte lade eine entsprechend gefüllte
Textdatei
hoch. Alternativ wie ich, zeige Code womit man sie so befüllt
wie du das willst.
Dazu noch deinen aktuellen Code mit dem du sie ausliest.
Vielleicht brauche ich das jetzt nicht mehr, da ich alle Daten korrekt in die Excel-Zellen übertragen habe, pro Datensatz (die 13 Strings) eine Zeile. Immerhin sind da 5294 Zeilen entstanden. Nur die Umlaute, das ß sowie die e und a mit dem Akzentzeichen mußte ich korrigieren, aber das ist ja bei Excel kein Problem.
Zu Random und Binary, wie gesagt, so ganz genau bis ins Detail
weiß ich wenig, warum auch, ich brauche das äußerst selten.
An dem Binary-Code (von rainer, weil ich nie weiß wie da die
genaue
Syntax ist *gg*) mag ich daß er Dateien auf einen Rutsch
einliest.
Dann habe ich sie im Arbeitsspeicher und bin dann dort sicher
schneller im Zugriff auf alle Datensätzen als du mit ner
Random-
Schleife.
Kann zeitlich ggfs. anders aussehen wenn man einzig den 567
ten
Datensatz aus der Datei braucht, k.A.
Gruß
Reinhard
Nicht daß wir uns mißverstehen, ohne Deine Hilfe hätte ich das mit dem Lesen nicht hinbekommen, weil ich den Knoten bei dem „get #FF“ hatte. Wenn erst mal eine Lösung existiert, bastele ich gern daran, welche weiteren Möglichkeiten es noch gibt. Bei der „Hilfe“ von Excel ist beschrieben, wie das „open“ funktioniert und das Close, was aber dazwischen zu stehen hat, fehlt. Die Beispiele in der Hilfe waren früher auch schon mal besser.
beste Grüße
Pauli