Coding-Schatzkästlein
Kleine Tips & Scripts zum Webdesign
Start > GfA-Basic > Fields

GfA-Basic: Datenfelder & Co. "Fields"
(mit Routine zum Entfernen von HTML-Tags)

(JavaScript-Version verfügbar)
Zusammenfassung

Name:  Fields
Aufgabe:  Stellt Funktionen für die Behandlung zeichenseparierter Wertefolgen (Datenfelder) zur Verfügung (JavaScript-Version verfügbar).
Benötigt:  GfA-Basic oder JavaScript 1.1
Beispiel:  getfield$("AA|BB|CC",2,"") ergibt "BB", addfield$("AA|BB",2,"XX","") ergibt "AA|XX|BB", ...
Download:  fields.lst (GfA-Original)
fields.js (GfA2JS-"Konvertierung")

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:
    Print @infield$("AA|BB|CC|BB","BB",0,"",0) ergibt: 2
    Print @infield$("AA|BB|CC|BB","B",0,"",0) ergibt: 0
    Print @infield$("AA|BB|CC|BB","B",0,"",-1) ergibt: 2
    Print @infield$("AA|BB|CC|BB","BB",3,"",0) ergibt: 4
  • setfield$(field$,nr%,string$,div$) Schreibe Feld: Gibt neues Gesamtfeld zurück. Beispiel:
    Print @setfield$("AA|BB|CC",2,"XX","") ergibt: AA|XX|CC
    Print @setfield$("AA|BB|CC",5,"XX","") ergibt: AA|BB|CC||XX
  • addfield$(field$,nr%,string$,div$) Ergänze Feld: Gibt neues Gesamtfeld zurück. Beispiel:
    Print @addfield$("AA|BB|CC",2,"XX","") ergibt: AA|XX|BB|CC
    Print @addfield$("AA|BB|CC",5,"XX","") ergibt: AA|BB|CC||XX
  • 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:
    Print @nrfield("AA|BB|CC",4,"") ergibt: 2
    Print @nrfield("AA|BB|CC",5,"") ergibt: 2
    Print @nrfield("AA|BB|CC",7,"") ergibt: 3

Der externe Quellcode: fields.lst
(JavaScript-Version: fields.js - benötigt die GfA2JS-Library)

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:
    Print @iblock$("<p>Ein <b>Absatz</b>!</p>",1,"<",">",-1) ergibt: <p>
    Print @iblock$("<p>Ein <b>Absatz</b>!</p>",2,"<",">",0) ergibt: b
    Print @iblock$("Fette <b>Schrift</b>!",2,"<",">",0) ergibt: /b
  • 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!


Updates:
03.01.2004: 
Änderung: field$() umbenannt in getfield$().


Kurz-URL dieses Artikels: http://Coding.binon.net/Fields