[Tustep-Liste] Was tun, wenn mit Hilfe von REQUEST aus dem Netz gezogene Sätze länger sind als 64000 Zeichen?

Kuno Schälkle schaelkle at zdv.uni-tuebingen.de
Mo Nov 15 13:26:42 CET 2021


Sehr geehrter Herr Luckscheiter,

> mit einem kleinen Progämmchen versuche ich, Informationen zu Personen aus der Korrespondenten-Datenbank des Hannoveraner Leibniz-Archvis zu ziehen. Bei vielen funktioniert das auch, nur bei wenigen werden die abgerufenen Sätze länger als 64000 Zeichen und lassen sich nicht weiterverarbeiten.
> 
> Der Code-Schnippsel unten gibt für id=140 ganz richtig "Brinon, Marie de" aus, anstatt für id=141 aber "Brosseau, Christophe" zu drucken, wird gemeldet:
> 
>>>>> Programmabbruch. END2. length > 64000.

Der Fehler tritt deshalb auf, weil ein Zeile länger als
64000 Zeichen ist und die Daten in einer Stern-Variablen
abgespeichert werden soll. Die maximale Zeilenlänge
in Stern-Variablen beträgt 64000 (2 hoch 16) Zeichen.

Um das Problem zu umgehen, kann man die Daten
statt in einer Sternvariablen in einer Datei abspeichern
und von dort zeilenweise einlesen und verarbeiten.
Ich habe Ihren Code-Schnipsel 

> - Liste mit Ids definieren
> IDs =*
>  DATA 140
>  DATA 141
> 
> - über die Liste loopen
> LOOP id= IDs
>  SET adresse = CONCAT ("https://leibniz.uni-goettingen.de/persons/view/ <https://leibniz.uni-goettingen.de/persons/view/>", id)
>  SET antw = REQUEST (adresse)
>  SET antw = DECODE (antw, UTF8)
> 
> - Namen aus der Antwort extrahieren
>  LOOP port = antw
>     IF (port .CT. ":hauptansetzung:") THEN
>        SET name = STRINGS (port, ":\Name*:")
>        SET name = STRINGS (name, ":value*</div:")
>        SET name = EXTRACT (name, 8,-5)
>      ENDIF
>  ENDLOOP
> - Namen auf der Konsole ausgeben
>    PRINT name
> ENDLOOP

entsprechend angepasst:

- Hilfsdatei erstellen

ERROR/STOP CREATE ("hilfsdatei", SDF-E)

- Liste mit Ids definieren
IDs =*
 DATA 140
 DATA 141

- über die Liste loopen
LOOP id = IDs

 SET adresse = CONCAT ("https://leibniz.uni-goettingen.de/persons/view/ <https://leibniz.uni-goettingen.de/persons/view/>", id)
 FILE/ERASE/BINARY "hilfsdatei" = REQUEST (adresse)
 ACCESS d: READ/RECORDS/UTF8 "hilfsdatei", num, port

- Namen aus der Antwort extrahieren
 LOOP
   READ/NEXT/EXIT d
    IF (port .CT. ":hauptansetzung:") THEN
       SET name = STRINGS (port, ":\Name*:")
       SET name = STRINGS (name, ":value*</div:")
       SET name = EXTRACT (name, 8,-5)
       PRINT name
     ENDIF
 ENDLOOP

 ENDACCESS d

ENDLOOP

- Hilfsdatei löschen

ERROR/STOP DELETE ("hilfsdatei")

Mit freundlichen Grüße
Kuno Schälkle
-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <http://lists.itug.de/pipermail/tustep-liste/attachments/20211115/4839ba90/attachment.htm>


Mehr Informationen über die Mailingliste Tustep-Liste