Ein Datensatz umfaßt i.d.R. mehrere Datenfelder. Wie praktisch, wenn diese
Felder innerhalb einer Zeile angeordnet sind:
Einfaches Datensatz-I/O-Handling
String-Funktionen auf einen kompletten Datensatz anwendbar
Datensatz-Sortierung in String-Arrays
Die bekanntesten solcher zeilenorientierten Datensätze sind die "CSV"
(Comma-separated Values) - die Felder sind hier durch Kommata getrennt -,
wie sie von Datenbanken und Tabellenkalkulationen als Exportformat angeboten
werden.
Um nun einfach an die einzelnen Felder heranzukommen, bzw. sie zu verändern,
dient die Bibliothek Fields. Und natürlich spricht nichts dagegen,
ein anderes Trennzeichen statt des Kommas zu verwenden. Es darf nur nicht
innerhalb eines Feldes als Inhalt vorhanden sein - dieses müsste dann codiert
werden (alternativ müssten diese Felder in Anführungszeichen eingeschlossen
werden, was ich aber aus verschiedenen Gründen bei dieser Bibliothek nicht
implementiert habe). Als Trennzeichen voreingestellt ist "|" (Pipe, ASCII 124),
falls kein anderes Zeichen übergeben wird.
Zur Adressierung der Felder werden diese, von 1 beginnend, durchnummeriert.
D.h., bei einem Datensatz Windows|128 MByte||40 GByte hat Feld 1
den Inhalt "Windows" und Feld 4 "40 GByte" (Feld 3 hat keinen Inhalt). Es kann
aber ohne Fehlermeldung auch das Feld 0 adressiert werden (entspricht Feld 1)
sowie die Felder 5 ff. (sie haben keinen Inhalt).
Die einzelnen Funktionen:
getfield$(field$,nr%,div$) Hole Feld: Gibt den Inhalt des gewünschten Feldes zurück. Beispiel:
Print @getfield$("AA|BB|CC",3,"") ergibt: CC
rfield$(field$,nr%,div$) Hole Feld von rechts: Gibt von rechts den Inhalt des gewünschten Feldes zurück. Beispiel:
Print @rfield$("AA|BB|CC",1,"") ergibt: CC
cfield$(field$,div$) Anzahl der Felder: Gibt die Anzahl der verfügbaren Felder zurück oder "0", falls das Gesamtfeld leer ist. Beispiel:
Print @cfield$("AA|BB|CC","") ergibt: 3
infield$(field$,string$,nr%,div$,part!) Finde Feld: Gibt die Nummer des gefundenen Feldes zurück oder "0", falls der Suchstring nicht im Gesamtfeld vorhanden ist. Beispiel:
delfield$(field$,nr%,div$) Entferne Feld: Gibt neues Gesamtfeld zurück. Beispiel:
Print @delfield$("AA|BB|CC",2,"") ergibt: AA|CC
adrfield(field$,nr%,div$) Adressoffset des Feldes: Gibt den Stringoffset des Feldes im Gesamtfeld zurück oder "0", falls das Feld nicht existiert. Beispiel:
Print @adrfield("AA|BB|CC",2,"") ergibt: 4
Print @adrfield("AA|BB|CC",3,"") ergibt: 7
nrfield(field$,adr%,div$) Nummer des Feldes (Umkehrfunktion zu adrfield()): Gibt die Nummer des Feldes zurück. Beispiel:
Als kleinen Bonus gibt es noch ein paar nicht groß getestete (Quick'n'Dirty ;-)) auf Fields basierenden Funktionen:
iblock$(field$,nr%,ldiv$,rdiv$,border!) Hole umschlossenen Block: Gibt den Inhalt des gewünschten Blockes zurück (mit oder ohne Blockgrenzen). Beispiel:
oblock$(field$,nr%,ldiv$,rdiv$,opened!) Hole ausgeschlossenen Block: Gibt den Inhalt des gewünschten Blockes zurück (komplett/nicht komplett von Blockgrenzen umschlossen). Beispiel:
Print @oblock$("<p>Ein <b>Absatz</b>!</p>",1,"<",">",-1) ergibt: Ein (1. Block ist umschlossen)
Print @oblock$("Fette <b>Schrift</b>!",1,"<",">",-1) ergibt: Schrift (1. Block ist offen)
Print @oblock$("Fette <b>Schrift</b>!",1,"<",">",0) ergibt: Fette (1. Block ist offen)
delblocks$(text$,ldiv$,rdiv$,opened!) Entferne IBlocks: Gibt den Rest zurück (komplett/nicht komplett von Blockgrenzen umschlossen). Beispiel:
Print @delblocks$("<p>Ein <b>Absatz</b>!</p>","<",">",0) ergibt: Ein Absatz! (1. Block ist umschlossen)
Print @delblocks$("Fette <b>Schrift</b>!","<",">",-1) ergibt: Schrift! (1. Block ist offen)
Print @delblocks$("Fette <b>Schrift</b>!","<",">",0) ergibt: Fette Schrift! (1. Block ist umschlossen)
Außerdem sind noch enthalten:
deltags$(html$,unix!) Lösche Tags: Wandelt HTML-Code in
Text-Code um (ohne Entity-Konvertierung, aber mit Leerzeichenzusammenfassung und
Zeilenumbrüchen - auf Wunsch nicht mit Windows- sondern Unix-Zeilenenden).
Benötigte Unterroutinen: rtag(), rc(), rm$()
Anmerkung: Lange Datensätze lassen sich leichter einlesen mit der Funktion
Erweitertes LINE INPUT!