fetch number oder   fetch +number

Aus der mit  open  geöffneten Datei werden number  Bytes in die interne Variable gelesen bzw. an diese angehängt. Dies funktioniert ab V28.3 auch mit Internetdateien, die weiteren Befehlsvarianten jedoch nicht. (Demo dazu:   fetchfil.flx  )

Obergrenze für  number ist 255999.

Dabei werden die Codes 0,1 ... 31  durch ^@, ^A ... ^_ ersetzt, also durch je zwei Zeichen!

Das Zeichen ^ selbst wird durch  ^~ ersetzt.

Fehlt number, wird 100 angenommen.

Mit  if cancel  ...  prüft man, ob keine Daten mehr vorgefunden wurden.

Mit  if "" ...  kann man dasselbe auch feststellen.

Hinweis: Auch eine ganze Datei in die iV einlesen kann man:  var Ffilename. Dabei bleiben aber die Steuerzeichen unverändert erhalten, d.h. Code 10 bleibt 10 usw.

Tip: Mit dem Befehl  spaces  kann man anschließend erreichen, daß alle Mehrfach-Spatien und sonstige aufeinanderfolgende Whitespace-Zeichen (9, 10, 13) durch ein einzelnes Spatium ersetzt werden.

 

fetch ^code oder   fetch +^code

Diese Variante bewirkt, daß alles bis zum nächsten Code code (dezimal, 0...255) inclusive gelesen und in der iV abgelegt wird (also auch der Code selbst am Ende).

code kann auch ein Buchstabe sein: ^A bedeutet dann z.B. den Code 1.

 

Ein vorgesetztes + bewirkt in beiden Fällen, daß die gelesenen Zeichen an den in der  iV schon vorhandenen Text angehängt werden.

 

Mit  if no  ... kann man prüfen, ob überhaupt gelesen werden konnte,

mit  if cancel  ...  ob das Ende der Datei erreicht wurde.

Soll genau eine Zeile gelesen werden (Begrenzungscodes 13 10):  -->  get 

 

fetch T^code  oder   fetch A^code

Es wird nur Text (nicht die Codes 13 10) bzw. nur allegro-Text (ohne die Codes <11 und 13, 26 und 27) gelesen. Die Code-Umwandlung in ^X findet dann bei Codes unterhalb 32 nicht statt. Hinter dem T bzw. A kann auch noch + stehen.

 

Sonderfälle:

 

fetch b  oder   fetch c   avanti

Es wird nur ein Byte gelesen und als Zahlenwert (0....255) in die iV geschrieben.

Bei  b  geht der Lesezeiger auf das nächste Byte über, bei c bleibt er stehen.

Letzteres kann dazu dienen, vor dem nächsten 'fetch' oder 'get' schon mal zu prüfen, mit welchem Zeichen die nächste Zeile beginnt. Wenn nichts gelesen werden kann, kommt -1 heraus, d.h. man prüft diesen Fall mit  if ="-1" ....

 

fetch b2 / b3 / b4   avanti

Es werden 2 bzw. 3 bzw. 4 Bytes gelesen und als hexadezimale Zahl interpretiert. Das Ergebnis steht dann als Dezimalzahl in der iV.

Nützlich ist dies für interne, binär codierte Zahlen wie z.B. Satznummern, etwa die Satznummer eines Datensatzes in einer Datenbankdatei (Typ .ALD).

 

fetch rec  avanti

Einen Datensatz einlesen von der aktuellen Position der geöffneten Datei des Typs .ALG , .ALD, .LOG oder .ADT. Zu diesem Zeitpunkt muß der Lesezeiger auf dem ersten Byte stehen, d.h. normalerweise auf der ersten 0 der Kategorienummer 00.

Achtung: Der Datensatz steht dann aber erst in der iV! Mit  insert  kopiert man ihn in den Arbeitsspeicher, meistens wird man aber vorher noch mit  new 0  dort einen neuen Satz anlegen, sonst mischt er sich mit dem aktuellen Satz.

Genauer: Der Befehl  fetch rec  holt den Satz in die iV, wobei zunaechst die Codes 10 und # als Trennung zwischen den Feldern fungieren. Mit dem Befehl

ins _^J#_;#_"

wandelt man diese Trennung um in ;# , und damit kann  ein simples

insert

den iV-Inhalt in den aktuellen Satz einfuegen, oder

insert $satz

in eine Variable  $satz. Genau das nutzt  update.job  aus.

 

Mit  if cancel ... kann man prüfen, ob nichts mehr gelesen werden konnte (Dateiende).

Für a99/alcarta gilt: (NICHT für avanti)

Wenn es eine Grunddatei ist (.ALG), muß man vorher fet b geben (in  iV steht dann "9", wenn es ein gelöschter Satz ist), bei einer Datendatei (.ALD)  noch dazu  fet b4, womit man die interne Satznr. in der iV hat; erst dann  fetch rec. (Bei avanti kann man das auch machen, muß man aber nicht.)

Beispiel: Ausgenutzt wird das alles in  ftr.flx, dem FLEX für die Volltextsuche.

Nur für avanti:    Nach dem Einlesen steht dann in der Sondervariablen  iR  die interne Satznummer des Satzes.

                                               Gelöschte Sätze werden nicht übergangen, aber beginnen dann mit    #u1    @@@@@ .

                               Mit   if Del   kann man sofort danach feststellen, ob es ein gelöschter Satz war. 

               

Sonderfall nur bei avanti : Die Datei kann auch eine LOG-Datei sein. 

War es ein gelöschter Satz, beginnt er mit #u1 @@@@@,

war es ein neuer Satz, beginnt er mit #u1 #####N, und N ist die Nummer der Datendatei, in die er zu speichern ist. Ausgenutzt wird alles dies im Job   update.job , mit dem das Programm acon Dateien die Arbeit des früheren Programms UPDATE.EXE übernehmen kann.

 

Hinweis: In avanti kann man einen Satz auch mit   read   einlesen, den ersten der Datei mit  read filename, womit die Datei zugleich geöffnet wird. Dabei hat dann aber die Tilde nicht die Funktion, eine neue Wiederholungskategorie zu erzeugen, das geht nur mit  fetch rec. und danach  insert.

 

fetch eN     (ab V27.2) avanti (ab V32.1)

Es wird eingelesen, bis die Zeichenfolge gefunden wird, die momentan in der iV steht, und zwar die ersten N Zeichen davon. Dadurch kann man vorher eine beliebige Zeichenkombination in die iV schreiben, nach der dann beim Einlesen gesucht wird. (Auch der Code 0 kann dabei vorkommen!) Der eingelesene Text, der danach in der iV steht, endet dann genau vor dieser Zeichenfolge, d.h. diese gehört nicht mehr dazu.

Ohne N wird der in der iV stehende Text in voller Länge genommen, kann dann aber keinen Code 0 enthalten.

Wichtig ist dieser Befehl beim Einlesen von Fremddaten zwecks Konvertierung, bes. im Fall XML.

Mit  if can ... prüft man, ob die Zeichenfolge nicht gefunden wurde,

und mit if "" ... , ob keine Daten mehr vorhanden waren, d.h. das Ende erreicht ist.

Tip: Mit dem Befehl  spaces  kann man anschließend erreichen, daß alle Mehrfach-Spatien und sonstige aufeinanderfolgende Whitespace-Zeichen durch ein einzelnes Spatium ersetzt werden.

 

fetch p

Die Position des Lesezeigers in der Datei wird festgestellt. Diese ist 0, wenn noch nichts gelesen wurde.

Das Ergebnis, eine Zahl, steht dann in der iV.

 

fetch m

Der Lesezeiger in der Datei wird auf die Position gesetzt, die in der iV angegeben ist. Das nächste fetch oder get wird von dieser Stelle aus lesen. Um den Zeiger wieder an den Anfang der Datei zu setzen, muß man schreiben:

var "0"

fetch m

Mit   fet c  und dann  if ='-1' ...  kann man checken, ob es  nicht geklappt hat.

 

Mit  if no ...  kann man checken, ob diese Sonderfälle nicht funktioniert haben, weil die Datei nicht geöffnet ist.

 

Mit  write  bzw.  write ^   kann man die Daten aus der iV in die Export-Ausgabedatei schreiben lassen. 

 

Beispiel 1:

Eine Datei, Typ .ADT oder .ALG, ist satzweise einzulesen und mit den Sätzen irgendetwas anzustellen:

 

open datafile // QuellDatei wird geöffnet, noch nichts gelesen

fetch rec

:loop

...                        Verarbeitung 

fetch rec          nächsten Satz einlesen

if not cancel jump loop         wenn noch einer da war, Sprung nach :loop

...                            weitere Befehle oder Ende des Auftrags

 

Beispiel 2:

Die FLEX-Datei   bfile.flx   kann als Muster herangezogen werden, wie eine binäre Datei in einer Schleife stückweise eingelesen und wieder geschrieben werden kann. Mit binären Dateien etwas wirklich Sinnvolles anzustellen ist allerdings eine heikle Aufgabe. Mehr dazu, besonders zum Lesen und Durchsuchen Byte für Byte, steht in dem Text "Trick 58".