Daten aus Fremddatei lesen, wie geht das?

Hallo,

ich habe vor Urzeiten mit TurboPascal eine Datei angelegt, die „Records“ gespeichert hat, wobei jeder Record aus mehreren Strings unterschiedlicher Länge besteht. Die Längen der Strings liegen mir vor. So ein Record ist in TP ein Speicherbereich, der mehrere mit Namen versehene Variablen enthalten kann. Jeder Record umfaßt bei mir die gleiche Anzahl von Bytes (222). Ich habe einige Tausend Records.
Um die Daten zu retten, möchte ich sie nach Excel übertragen, wobei jeder String eines Records in eine eigene Zelle gespeichert wird. Ich habe mir vorgestellt, die Daten Byte für Byte aus der Datei zu lesen oder aber jeweils in der Länge der Strings und diesen String (Text) dann in die betreffende Zelle zu schreiben.

Ich habe Excel 2010 mit Office 2010 unter Windows 7 64bit. Meine erste Anweisung in VBA ist
Open „Musik.dat“ For Random As #1 Len = 222

Nun weiß ich nicht, mit welcher Anweisung das eigentliche Lesen erfolgt. Mit "read#1 " habe ich Versuche gemacht, VBA markiert das zwar nicht als Fehler, aber so komme ich nicht weiter. Wie packe ich das Gelesene in einen String oder in eine Zelle? Mit der VBA-Hilfe komme ich nicht weiter, da sie nicht vollständig installiert zu sein scheint.

Für Tipps wäre ich dankbar
Gruß
Pauli

Hallo Pauli,

Ich habe Excel 2010 mit Office 2010 unter Windows 7 64bit.
Meine erste Anweisung in VBA ist
Open „Musik.dat“ For Random As #1 Len = 222

probiere mal den nachstehenden Code.

Mit der VBA-Hilfe komme ich nicht weiter, da sie
nicht vollständig installiert zu sein scheint.

Starte nochmal Offie-Setup, vllt. fehlt da ein Häkchen bei
Vba-Hilfe.
Es steht nicht unter Excel sondern unter Office o.ä.
Ansonsten, ich habe kein XL 2010.

Gruß
Reinhard

Option Explicit

Sub TP()
Dim N As Long, strDatei As String
With Worksheets("Tabelle1")
 .Columns(1).ClearContents
 strDatei = Einlesen("...Pfad...\Dateiname.tp")
 For N = 1 To Len(strDatei) Step 222
 .Cells(N, 1).Value = Mid(strDatei, N, 222)
 Next N
End With
End Sub

Function Einlesen(Datei) As String
Dim FF As Long
FF = FreeFile
Einlesen = Space(FileLen(Datei))
Open Datei For Binary As #FF
 Get #FF, , Einlesen
Close #FF
End Function

Hallo Reinhard,
danke für Deine Antwort, leider werden keine Daten aus der Datei gelesen. Ich habe zwecks der Übung Deinen Vorschlag auf das Notwendigste reduziert (hoffentlich nicht zu viel), um mit den Anweisungen zu variieren. Dabei ist folgendes rausgekommen:

Private Sub CommandButton1_Click()
Dim N, FF As Long, Daten As String
With Worksheets(„Musikprogramm“)
.Columns(1).ClearContents
FF = FreeFile
Open „Musik.dat“ For Random As #FF
'Daten = String(222, „a“)
Get #FF, 1, Daten
For N = 1 To Len(Daten) Step 222
.Cells(N, 1) = Mid(Daten, N, 222)
Next N
Close
End With
End Sub

Bei „Get #FF“ erwarte ich, daß Daten in die Variable „Daten“ gesetzt werden, was aber nicht passiert. Schiebe ich im VBA (mit Stop-Marke) den Positionspfeil erneut auf den Open-Befehl und löse mit F8 aus, kommt die Meldung, die Datei sei schon offen, ist also ok.

Meine Datendatei „Musik.dat“ sieht am Anfang wie folgt aus:

#Night Drive #Let’s Dance With the Ventures

als Hexadezimal steht dort dann:

234E69676874204472697665202020202020202020202020202020202020202020202020234C657427732044616E6365 usw.

Vor jedem Wort steht die Länge des folgenden String, hier also „Hex 23“ für die 35 folgenden Zeichen. Dieses Prinzip geht bis zum letzten Zeichen an Position 222, wonach dann als Position 223 die „Hex 23“ kommt für den nächsten Satz. Der Inhalt dieser Datei dürfte doch wohl für den String egal sein, oder? Es sollte zumindest mit „get“ gelesen werden. Den gelesenen Inhalt kann ich dann auseinanderpflücken.

Wenn ich oben im Makro „Daten“ mit 222 Zeichen „a“ belege, ist Daten NACH dem GET-Befehl leer, also Länge 0. Kann daran erkannt werden, was nicht funktioniert?

Danke für Deine Unterstützung
Gruß
Pauli

#Night Drive #Let’s Dance With the
Ventures
234E69676874204472697665202020202020202020202020202020202020202
020202020234C657427732044616E6365 usw.

Hallo Pauli,

nachstehender Code ist getestet und funktioniert. Wenn bei dir nicht
so brauche ich eine originale musik.dat.
Hochladen z.B. mit dem obersten Link in FAQ:2606

Gruß
Reinhard

Option Explicit

Private Sub CommandButton1\_Click()
Dim N, FF As Long, Daten As String, D
Const Datei As String = "K:\musik.dat"
FF = FreeFile
Call Erzeuge
Daten = Space(FileLen(Datei))
Open Datei For Binary As #FF
 Get #FF, , Daten
Close #FF
D = Split(Daten, "#")
With Worksheets("Musikprogramm")
 .Columns(1).ClearContents
 For N = 1 To UBound(D)
 .Cells(N, 1).Value = Trim(Replace(Replace(D(N), Chr(13), ""), Chr(10), ""))
 Next N
 Close #FF
 .Columns("A").AutoFit
End With
End Sub

Sub Erzeuge()
Dim FF As Long
Const Lied1 As String = "#Night Drive "
Const Lied2 As String = "#Let's Dance With the Ventures "
FF = FreeFile
Open "K:\musik.dat" For Output As #FF
Print #1, Lied1
Print #1, Lied2
Close #FF
End Sub
1 Like

Hallo Reinhard,

es funktioniert prima. Erst habe ich das mit Deiner Hilfsdatei gemacht, danach habe ich dem Makro die Originaldatei untergeschoben. Auch die wurde in über 10.000 Zeilen eingetragen.

Herzlichen Dank für Deine Hilfe,
die mir mindestens 1 Stern wert ist

Pauli

es funktioniert prima. Erst habe ich das mit Deiner Hilfsdatei
gemacht, danach habe ich dem Makro die Originaldatei
untergeschoben. Auch die wurde in über 10.000 Zeilen
eingetragen.

Hallo Pauli,

freut mich das es klappt. 10.000 Zeilen? dann bau mal anfangs des codes ein:
Application.screenupdating=false
und zum ende des Codes ein
Application.screenupdating=true

Wenn du das wegläßt so wird bei jedem Zelleintrag die Tabelle
refresht also neu/geändert angezeigt, ist ja unnötig und verlangsamt
ungemein.

Zu binary und random Zugriff, klar kenne ich da die Grundlagen um was
es da geht bei dem Thema, also um wahlfreien oder sequentiellen
Dateizugriff usw. aber wenn du genaueres Wissen bzw. nachfragen hast
so stelle die Frage neu. Feinheiten kenne ich nicht so um was zu
erklären.
Rainer, Thomas u.a. wissen das auswendig :smile:

Gruß
Reinhard

Hallo Reinhard

es funktioniert prima. Erst habe ich das mit Deiner Hilfsdatei
gemacht, danach habe ich dem Makro die Originaldatei
untergeschoben. Auch die wurde in über 10.000 Zeilen
eingetragen.

Hallo Pauli,

freut mich das es klappt. 10.000 Zeilen? dann bau mal anfangs
des codes ein:
Application.screenupdating=false
und zum ende des Codes ein
Application.screenupdating=true

ach, das Eintragen in die Zellen geht so schnell, daß ich die Taste noch nicht losgelassen habe, wenn die Routine fertig ist. Ich übertrage die Daten in eine andere, geöffnete Exceldatei, ohne aber das Eintragen zu sehen.

Gibt es eine Erklärung dafür, daß in der Deklaration
„Dim N, FF As Long, Daten As String,“
dieser Eintrag so empfindlich ist? Wenn ich hinter „Daten“ noch z.B. schreibe:
„Dim N, FF As Long, Daten, Datei1 As String,“ dann funktioniert die Anweisung „Get #FF, , Daten“ nicht mehr. Streiche ist die Variable „Datei1“ wieder, funktioniert auch der GET-Befehl wieder.
Mich würde nur mal interessieren, woher das kommt. Oder wäre die Frage in einer neuen Anfrage besser untergebracht?

Wenn du das wegläßt so wird bei jedem Zelleintrag die Tabelle
refresht also neu/geändert angezeigt, ist ja unnötig und
verlangsamt
ungemein.

Zu binary und random Zugriff, klar kenne ich da die Grundlagen
um was
es da geht bei dem Thema, also um wahlfreien oder
sequentiellen
Dateizugriff usw. aber wenn du genaueres Wissen bzw.
nachfragen hast
so stelle die Frage neu. Feinheiten kenne ich nicht so um was
zu
erklären.
Rainer, Thomas u.a. wissen das auswendig :smile:

Gruß
Reinhard

Gruß
Pauli

Gibt es eine Erklärung dafür, daß in der Deklaration
„Dim N, FF As Long, Daten As String,“
dieser Eintrag so empfindlich ist? Wenn ich hinter „Daten“
noch z.B. schreibe:
„Dim N, FF As Long, Daten, Datei1 As String,“ dann
funktioniert die Anweisung „Get #FF, , Daten“ nicht mehr.
Streiche ist die Variable „Datei1“ wieder, funktioniert auch
der GET-Befehl wieder.
Mich würde nur mal interessieren, woher das kommt. Oder wäre
die Frage in einer neuen Anfrage besser untergebracht?

Hallo Pauli,

kann ich nicht nachvollziehen, bei mir macht das dem Code
nix aus.
Kommt da eine Fehlermeldung?

Ja, mache eine neue Anfrage. Zeige deinen aktuellen Code
wo das auftritt. Die Prozedur „Erzeuge“ zeige auch dann können
andere leichter selbst testen.

Gruß
Reinhard