Hi,
ich habe ein kleines Problem mit der Aufbereitung von Datenstrings
um diese z.B. in das sevDataGrid zu bekommen.
Basis:
Aus einer Quelldatei, die wie folgt von einem anderen Programm
erzeugt wurde:
......
Open sFile For Random As #1 Len = 128
Put #1, , sDataSet128
...... ..., möchte ich alle echten Datensätze in die Form:
"Wert1;Wert2;Wert3; .......;Wert14" bringen, um diese dann weiter zu verarbeiten. Export in CSV File, Import in sevDatGrid usw.
Dateiaufbau:
- Jeder Eintrag ist 128 Zeichen lang!
- Den Daten vorangestellt sind Infos. Der Infoblock wird immer mit "@" abge-
schlossen! D.h. auch Textinfos wurden vorher in Stücke zu je 128 Zeichen zerlegt.
- Die Daten (14 Stück) sind durch Leerzeichen (keine feste Anzahl!)
getrennt. immer in einem Datensatz zu 128 Zeichen enthalten z.B.
Kopfinformationen....
.....................
....................@
Zeile n+1
Zeile n+2
Zeile n+3
123 45 AA 1234 +111 -1234 7 8 9 10 11 12 13 14 Ich habe mir einen Algorithmus ausgedacht, der zwar funktioniert, aber leider
nicht der schnellste ist. Hat jemand eine gute Idee dies zu beschleunigen??
Private Sub Command3_Click()
Dim sDataSet As String * 128 'Zielstring für einzulesende
' Daten
Dim lngSetNum As Long 'Anzahl der enthaltenen
' Datensätze
Dim bFirstSpaceFound As Boolean 'Kennzeichen für erstes
' Leerzeichen
Dim lngPosFirstDataSet As Long 'zeigt den ersten echten
' Datensatz
Dim iFile As Integer 'Variable für Dateinummer
Dim lngIdx As Long 'Laufvariablen
Dim iIdx As Integer
Dim sNewData As String 'Ergebnisstring mit
' aufbereiteten Daten
'Datei öffnen
iFile = FreeFile
Open App.Path & "\" & "01010006.d01" For Random As #iFile Len = 128
'Anzahl der Gesamtdatensätze bestimmen incl. Kopfinfos
lngSetNum = LOF(iFile) / Len(sDataSet)
'Vor den eigentlichen Daten befindet sich eine unbestimmte
'Anzahl von Informationen (immer mit @ abgeschlossen!)
'Finde "@"
For lngIdx = 1 To lngSetNum
Get #iFile, lngIdx, sDataSet
If InStr(sDataSet, "@") <> 0 Then
'Nach 3 weiteren Infozeilen zu 128 Zeichen folgen die Daten!
lngPosFirstDataSet = lngIdx + 4
Exit For
End If
Next lngIdx
'Alle echten Datensätze durchforsten
For lngIdx = lngPosFirstDataSet To lngSetNum
Get #iFile, lngIdx, sDataSet
sNewData = ""
bFirstSpaceFound = True 'noch kein Leerzeichen
For iIdx = 1 To 128
Select Case InStr("0123456789ABCDEF-+ .,", UCase(Mid(sDataSet, _
iIdx, 1)))
Case 19 'pos. des Leerzeichens in der Vergleichs-Zeichenkette
If Not bFirstSpaceFound Then
sNewData = sNewData & ";"
bFirstSpaceFound = True
End If
Case Is > 0 'wenn erlaubtes Zeichen gefunden
sNewData = sNewData & Mid(sDataSet, iIdx, 1)
bFirstSpaceFound = False
End Select
Next iIdx
'infolge des Algo. wird noch das letzte ";" wieder entfernt
If Right(sNewData, 1) = ";" Then
sNewData = Left(sNewData, Len(sNewData) - 1)
End If
'Verarbeiten des aufbereiteten Datenstrings
'z.B. Platzieren in einer Tabelle o.ä.
'z.B. sub_PlaceInDatatable sNewData
Next lngIdx
Close #iFile
End Sub Vielen Dank im voraus.
Woellmi
Tschaui
Woellmi  |