[Tustep-Liste] Kopiere-Austauschtabelle

F.Seck f.seck at t-online.de
Sa Aug 8 23:45:05 CEST 2009


Liebe Listenleser,
besonders Herren Hellmann, Osthof, Gasperlin und nun auch Trauth,

weil ich die von mir (e-mail vom 6.8. 19:15) als möglich angedeutete Erweiterung wirklich brauchte, habe ich eine konventionelle Lösung hingeschrieben, die ich Ihnen nicht vorenthalten möchte.
Sie ersetzt das Register-Aufbereite mit einem einzigen Parameter durch ein Kopiere mit 27 Parametern, leistet natürlich auch mehr. Zunächst das kleine Programm (das man sich natürlich über den Windows-Zwischenspeicher leicht in eine TUSTEP-Datei holen kann):

#SVORBEREITE,qq,-STD-,-,+,*,,-
ssl       200
*eof
#SORTIERE,-STD-,-STD-,1+200'0,+,1+200
#KOPIERE,-STD-,zz,+,*,,-
           0  w  n  j  2  3  4  5
spr   1   11 21 13 12 21  9  8  8  ist | Trennzeichen?
spr   2    8  8 25 23  8  0  8 31  ganze Parameter übereinstimmend?
spr   3    8  8 35 33  8 51  8 51  auch Groß/Kleinschreibung?
spr   5    8  8 55 53  8  3  8  3  Abweichung in Austauchzeichenfolge?
ws+   1   ws1
pos   1   11
ta+   1   -|-
mld   1   :@@@@@@@@ Trennzeichen ist nicht |; bitte unten in Parameter:
mld   1   :@@@@@@@@ av    2 statt | das benutzte Trennzeichen einsetzen!:
wss   1   ws1
vgl   2   0
vtz   2   2
mld   2   |@@@@ Parameter mit vorangehendem identisch, daher gelöscht:|
xv    3   |<*|<-01|
vgl   3   0
vtz   3   3
mld   3   |@@@@@@@@ Parameter bis auf Groß-/Kleinschreibung mit
mld   3   |@@@@@@@@ vorangehendem identisch, bitte einen löschen!|
          Vorausgesetzt, "|" ist Trennzeichen:
av    5   :|:
ev    5 = av    5
vgl   5   0
vtz   5   5
mld   5   |@@@@@@@@ Vergleich mit vorangehendem Parameter:|
mld   5   |@@@@@@@@ Suchzeichenfolge identisch, Austauschzf. verschieden;|
mld   5   |@@@@@@@@ bitte in Quell- oder Zieldatei einen Parameter löschen.|
*eof

Die Leistung des alten Regiser-Aufbereite steckt hier im 2. Durchgang: Jeder Satz wird in den Merk-Vergleichtext gesteckt, dann der nächste mit ihm verglichen und, wenn er identisch ist, nicht ausgegeben, wohl aber gemeldet (es könnte ja für die Fehlersuche interessant sein zu erfahren, welche Sätze doppelt sind; wen das stört, der kann im Parameter spr    2  aus der 23 eine 0 machen).
Ein nicht gar so kleiner Unterschied: Register-Aufbereite behandelt Groß- und Kleinbuchstaben gleich, Kopiere unterscheidet sie, d.h. die Parameter
xx        |g|GmbH|
xx        |g|GMBH|
sind für #RA identisch, also wird nur der zuerst vorkommende ausgegeben; Kopiere unterscheidet sie und ermöglicht eine Auswahl nach nicht-zufälligen Kriterien.
Natürlich wollen wir auf diese Fälle hingewiesen werden. Das geschieht im 3. Durchgang, wo wir mit xv  Großbuchstaben für den Vergleich wie die entsprechenden Kleinbuchstaben behandeln, so daß nun doch wieder 2 identische Sätze hintereinander(zu)stehen (scheinen).
Im 5. Durchgang schließlich werden nur die Suchzeichenfolgen aufeinanderfolgender Parameter verglichen; sind sie identisch, wie in folgendem Beispiel:
xx        |g|Gesellschaft mit beschränkter Haftung|
xx        |g|GmbH|
dann liegt ein Fehler vor, denn ganz identische Parameter sind ja an dieser Stelle schon eliminiert. Um die Suchzeichenfolgen zu isolieren, muß das Trennzeichen bekannt sein, da es ja die Suchzeichenfolgen begrenzt. Hier wird, wie auch von Herrn Osthof, der senkrechte Strich angenommen. Ob das wirklich so ist, wird beim ersten Satz im 1. Durchgang geprüft.
Man kann das alles auch in ein Kommandomakro stecken und Quelle, Ziel und Trennzeichen variabel machen.

Auch für diese erweiterte Erweiterung ist natürlich eine Lösung in der Makrosprache denkbar und zu erwarten.
In einer Anwendung zur Inkunabelkatalogisierung (INKA) habe ich die Kleinigkeit von  83788 TTT-Parametern, durchschnittliche Länge 71 Zeichen. An diesen habe ich Herr Osthofs erste Lösung ausprobiert: sie läuft schnell und tadellos. Mit der doppelten Menge ging es auch, mit den dreimal hintereinanderkopierten kam aber die Fehlermeldung
"Daten zu umfangreich (>16 MB)".
Das sollte ein Härtetest sein; in der Praxis werden 250.000 Parameter selten sein. Wenn doch, dann gibt es ja immer noch die Kommandos - siehe oben.

Mit freundlichen Grüßen
Friedrich Seck

--------------------------------------
Dr. Friedrich Seck
72076 Tübingen, Erlenweg 18
Tel: (0 70 71)  96 49 40
Fax-Nummer auf Anfrage
----- Original Message ----- 
From: "Matthias Osthof" <matthias.osthof at t-online.de>
To: <tustep-liste at itug.de>
Sent: Thursday, August 06, 2009 10:29 PM
Subject: Re: [Tustep-Liste] Kopiere-Austauschtabelle


Diskussionsforum Tustep-Liste
Weitere Informationen: www.itug.de
------------------------------------------------------------

Lieber Herr Seck, lieber Martin,

> Natürlich kann man sich auch eine weitergehende Lösung ausdenken, 
> die auf den genannten Fehler hinweist.
Die Tabelle enthält nach dem Sortieren und Eliminieren von
Mehrfacheintragungen noch Einträge der Art:
xx        |aaa|bbb|
xx        |aaa|falsch|   

Der LOOP isoliert bei jedem Eintrag in der Liste die Suchzeichenfolge mit
EXTRACT() und vergleicht sie mit der in x_alt gespeicherten des
vorangehenden Eintrags. Wenn beide identisch sind, gibt er den Parameter in
einer (in dieser Form spartanischen) Meldung aus. Man könnte das Ganze
benutzerfreundlicher gestalten, darauf habe ich der Übersichtlichkeit halber
verzichtet.


SET xx = FILE ("params")
SET xx = ALPHA_SORT (xx)
SET xx = REDUCE (xx)

SET x_alt = ""
BUILD S_TABLE trenner = ".|."
LOOP lp = xx
  SET x_neu = EXTRACT (lp, 12, trenner)
  IF (x_alt.EQ.x_neu) THEN
    + @@@@@@@@ {lp}
  ENDIF
  SET x_alt = x_neu
ENDLOOP

FILE/ERASE/PROGRAM "params" = xx 


Einen schönen Abend wünscht
Matthias Osthof
-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <https://lists.itug.de/pipermail/tustep-liste/attachments/20090808/cfdbc7af/attachment.htm>


Mehr Informationen über die Mailingliste Tustep-Liste