Hallo!
Ich habe eine Text-Datei, aus der ich eine Notes DB machen will. Die Informationen sind in Spalten fester Breite definiert, aber nicht alle Spalten enthalten Werte oder sind mit der maximalen Anzahl an Zeichen gefüllt. Da es keine Trennzeichen gibt, bedeutet das, dass zwischen den einzelnen Informationen der Felder mal mehr mal weniger Leerzeichen stehen.
Vier Zeilen aus der zu importierenden Text-Datei:
4T A02.- Sonstige Salmonelleninfektionen
4I Inkl.: Infektion oder Lebensmittelvergiftung durch Salmonellen
außer durch Salmonella typhi und Salmonella paratyphi
LZPer Schaltfläche soll der Import starten.
Ich habe mir einen Type definiert, über die ich beim Lesen füllen will. Leider funktioniert das nicht so, wie ich mir das vorstelle. Im unten gegebenen Code habe ich nur das Lesen getest. Das funktionier, liefert aber Mist. Die Verarbeitung habe ich weggelassen.
(Declarations)
Type ICD
Sp1 As String *1
Sp2 As String *1
Sp3 As String *1
Sp4 As String *9
Sp5 As String *68
End Type
(Click)
Sub Click(Source As Button)
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim sFilename As Variant
Dim fileNum As Integer
Dim recLen As Integer
Dim recCount As Long
Dim Eingabe As ICD
Set db = session.CurrentDatabase
sFilename = ws.OpenFileDialog( False, "ICD - Code Import", "Textdatei|*.txt", "C:\Temp\")
recLen = Len(Eingabe)
If Isempty(sFilename) Then
Exit Sub
End If
fileNum% = Freefile()
Open sFilename(0) For Random As fileNum Len=recLen
recCount = 1
Do While Not Eof(fileNum%)
Get #filenum, recCount, Eingabe
recCount = recCount + 1
Loop
Close #filenum
End Sub
Obwohl Type ICD nur 80 Stellen definiert, kommt LEN auf
160 Stellen.
In der Hilfe zu "Random" ist dann folgendes zu lesen:
User-defined types can be used to define compound records.
For example:
Type emploRec
id As Integer ' Integers are 2 bytes long
salary As Currency ' Currency is 8 bytes
hireDate As Double ' Dates are also 8 bytes
lastName As String * 15 ' Fixed-length string of 30 bytes
firstName As String * 15 ' Fixed-length string of 30 bytes
End Type
The length of a type can be determined at run time using the Len function.
For example, this record is 78 bytes long, so supply Len = 78 in the Open statement.
In der Hilfe gehen irgendwie die Begriffe "Byte" und "Character" durcheinander. In der Hilfe zu "String [*
num]" steht
num für die Anzahl der Character. In der Hilfe zu "Len function" steht ebenfalls, dass die Anzahl der Characters zurückgegeben wird. Oben nun steht "String*15 = 30 Bytes. Wie geht das denn? Außerdem dachte ich seit 30 Jahren, dass in Deutschland ein Byte = ein Character ist.
Aber wie dem auch sei: Wenn dann ein Datensatz eingelesen wird, kann man im Debugger erkennen, dass jedes Feld von Type mit der richtigen Anzahl an Zeichen gefüllt ist. Aber es sind nur nicht-darstellbare Zeichen (Kästchen) zu erkennen, keine lesbaren Zeichen (siehe Debugger-Bild; ich hoffe, man kann was erkennen).
Ich könnte auch mit "Line Input" arbeiten, muss dann aber den eingelesenen String mit der MID function "zerpflücken". Da ich in Abhängigkeit der Werte an den Stellen 1 und 2 evtl. Sätze nachlesen muss, die dann aber zum selben Notes Dokument gehören, müsste ich den Code fehrfach einfügen oder in eine eigene Funktion packen, die ich dann immer aufrufen müsste. Ich wollte diese ganzen Codezeilen und Sprünge vermeiden.
Es kann doch wohl nicht so schwer sein, einen einfachen Text mit einer selbstdefinierten Struktur (Type) einzulesen...
Vielen Dank schon mal vorab.
Edit:
Ich habe den Screenshot etwas verkleinert. Mehr ging leider nicht, sonst wäre die Lesbarkeit verloren gegangen.
Axel