Mittels VBA Datei mit unterschiedlich langen Datensätzen einlesen

22/06/2009 - 18:58 von Nitrox | Report spam
Eine Frage für Programmierer mit Erfahrung (Excel 2007)

Ich habe eine Daten-Datei vorliegen, die den folgenden Aufbau hat:
1. Initialzeile: Zahl1 (Integer), Zahl2 (Long), Unbekannt (String, 15
Zeichen lang)
2. Datenzeile: Recordstatus (Integer), Recordlànge (Long), Zahl1 (Long),
Zahl2 (Long), Text1 (String mit variabler Lànge, ch$(0) ist das
Schlusszeichen, die Lànge des String steht also nicht wie in VBA üblich am
Anfang des Strings.
3. Beiliebige Anzahl weitererer Datenzeilen analog Zeile 2.

Das Feld Recordlànge beinhaltet die komplette Lànge des jeweiligen
Datensatzes, also fix 14 Bytes an Zahlen plus die jeweilige variable
Textlànge. Man muss also erste die Recordlànge auslesen, damit man die echte
Lànge des Datensatzes kennt.

Durch die Eigenschaft des Binàrfiles, ohne Fehlermeldung über die Filelànge
hinaus zu lesen, habe ich es geschafft, die Daten fehlerfrei und vollstàndig
auszulesen. Beim Zurückschreiben muss ich aber nun den String korrekt
deklarieren, damit die Datei wieder lesbar wird. Dies klappt nun mit dem
"gewöhnlichen" Basic-String nicht mehr.

Kann mir jemand erklàren, wie man - sowohl das Lesen, als auch das
Schreiben - typgerechtecht und mit flexibler Stringlànge programmieren kann?

Danke und Gruss
Nitrox
 

Lesen sie die antworten

#1 Nitrox
22/06/2009 - 19:42 | Warnen spam
Hallo Leute,

Hier noch mein Code:

\\\
Type typKopf
FileStatus As Byte 'Der Status kann Zahlen zwischen 0 und
100 aufweisen
FileLength As Long 'Eigentlich die Dateilànge, stimmt aber
nicht immer!
FileDummy As String * 16 'Ergànzt den Record auf 21 Zeichen (16 + 4 +
1 = 21)
End Type

Type typZeile 'Total: max. 96 Bytes, jedoch
variabel
RecordStatus As Byte '1 byte: 0 oder 2.
RecordLength As Long '4 bytes: Lànge des Records in bytes
(beinhaltet alle Felder)
Coord_N As Long '4 bytes: Coord_N
Coord_E As Long '4 bytes: Coord_E
Description As String * 83 'Null-Terminated ASCII-String, Lànge
variabel, max 83 Bytes
End Type

Sub Daten_Lesen(Optional strFilename As String = "")
On Error GoTo Err_Handler

Dim strDateiName As Variant
Dim oKopf As typKopf
Dim oZeile As typZeile
Dim lngStartData As Long

If strFilename <> "" Then
strDateiName = strFilename
Else
ChDir Application.ThisWorkbook.Path
strDateiName = Application.GetOpenFileDescription("XYZ-Files
(*.tst), *.tst")
End If
If strDateiName <> False Then
Open strDateiName For Binary As #1

'Kopfzeile lesen
Get #1, 1, oKopf
Debug.Print strDateiName
Debug.Print oKopf.FileStatus; ", "; oKopf.FileLength

'Daten lesen
lngStartData = 22
While Not EOF(1):
Get #1, lngStartData, oZeile
Debug.Print oZeile.RecordStatus; ", "; ;
oZeile.RecordLength; ", "; ; oZeile.Coord_N; ", "; oZeile.Coord_E; ", ";
sTrim(oZeile.Description)
lngStartData = lngStartData + oZeile.RecordLength
Wend
'Über das Ziel hinaus lesen, da Abfragetextlànge zu gross ist
und daher EOF zu früh gemeldet wird.
Get #1, lngStartData, oZeile
Debug.Print oZeile.RecordStatus; ", "; ; oZeile.RecordLength; ",
"; ; oZeile.Coord_N; ", "; oZeile.Coord_E; ", "; sTrim(oZeile.Description)
lngStartData = lngStartData + oZeile.RecordLength

Close #1
End If

Exit_sub:
Exit Sub

Err_Handler:
Close #1
MsgBox Err.Description
GoTo Exit_sub

End Sub

Function sTrim(s As String) As String
'Nullterminated-String in VBA-String umwandeln
Dim i As Integer
i = InStr(s, Chr$(0))
If (i > 0) Then
sTrim = Trim(Left(s, i - 1))
Else
sTrim = Trim(s)
End If
End Function

Sub Daten_Schreiben()
On Error GoTo Err_Handler

Dim strDateiName As String
Dim oKopf As typKopf
Dim oZeile As typZeile
Dim lngStartData As Long
Dim strDataDescription As String

ChDir Application.ThisWorkbook.Path
strDateiName = Application.ThisWorkbook.Path & "\MeineDatei.tst"
If Dir(strDateiName) <> "" Then Kill strDateiName
Open strDateiName For Binary As #1

'Kopfzeile schreiben
With oKopf
.FileLength = 10
.FileStatus = 100
.FileDummy = "Dummytext" & Chr(0)
End With
Put #1, 1, oKopf

'1. Datensatz schreiben
lngStartData = 22
strDataDescription = "Beschreibung Zeile 1"
With oZeile
.RecordStatus = 2
.Coord_N = 123456
.Coord_E = 789012
.Description = Trim(strDataDescription) & Chr$(0)
.RecordLength = 14 + Len(strDataDescription)
End With
Put #1, lngStartData, oZeile
lngStartData = lngStartData + oZeile.RecordLength

'2. Datensatz schreiben
strDataDescription = "Chlausenegg (Zugersee)"
With oZeile
.RecordStatus = 2
.Coord_N = 3579
.Coord_E = 23456
.Description = Trim(strDataDescription) & Chr$(0)
.RecordLength = 14 + Len(strDataDescription)
End With
Put #1, lngStartData, oZeile
lngStartData = lngStartData + oZeile.RecordLength

Close #1

Exit_sub:
Exit Sub

Err_Handler:
Close #1
MsgBox Err.Description
GoTo Exit_sub

End Sub

Sub Daten_einlesen()
Daten_einlesen_Ov2
End Sub
///

Ende Posting

Ähnliche fragen