Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

@COMPARE (Format 1) - Vergleichen zweier Arbeitsdateien

&pagelevel(3)&pagelevel

Dieses Format der Anweisung @COMPARE bewirkt, dass der EDT zwei Arbeitsdateien ganz oder teilweise miteinander vergleicht. Das Ergebnis des Vergleichs kann wahlweise in eine Arbeitsdatei, auf SYSOUT oder auf SYSLST ausgegeben werden.

Operation

Operanden

F-Modus / L-Modus

@COMPARE

[procnr1] :lines1 WITH [procnr2] :lines2

[ ,[int1] [(int2)] [LIST [line [(inc)] ] ] ]

procnr1, procnr2

Nummern der miteinander zu vergleichenden Arbeitsdateien (0..22). Ein
Vergleich von Bereichen aus der gleichen Arbeitsdatei (procnr1 gleich
procnr2) ist gestattet. Ist eine der Vergleichsdateien die Arbeitsdatei 0 und
ist in ihr eine Datei durch @OPEN, Format 2 real geöffnet, so wird
@COMPARE mit der Fehlermeldung EDT4935 abgewiesen. Wird procnr1
oder procnr2 nicht angegeben, wird für den jeweiligen Operanden der
Wert der aktuellen Arbeitsdatei verwendet.

lines1, lines2

Zeilenbereiche, die miteinander verglichen werden sollen. Der Operand
lines1 definiert den Zeilenbereich in der ersten Arbeitsdatei (procnr1).
Der Operand lines2 definiert den Zeilenbereich in der zweiten Arbeitsdatei
(procnr2). Beide Zeilenbereiche müssen nicht leer sein, sonst wird die
Anweisung mit dem Fehler EDT4932 abgewiesen.

int1, int2

Über int1 und int2 kann beeinflusst werden, wie tolerant sich der EDT im
Falle von ungleichen Zeilen verhält. Findet der EDT innerhalb von int1
Zeilen nicht mindestens int2 aufeinander folgende Zeilen, die in beiden
Dateien gleich sind, bricht er den Vergleich ab.

Mit int2 wird zusätzlich festgelegt, wie viel aufeinander folgende Zeilen
aus der einen Arbeitsdatei mit der entsprechenden Anzahl aufeinander
folgender Zeilen aus der anderen Arbeitsdatei mindestens übereinstimmen
müssen, damit der EDT die aus diesen Zeilen bestehenden Bereiche als
gleich betrachtet.

Für int1 und int2 gilt: int2 <= int1 <= 65535. Der Standardwert für int1
ist 10, für int2 ist er 1.

LIST

Bestimmt, wohin der EDT das Ergebnis des Vergleichs ausgibt.

Wird LIST ohne line angegeben, gibt der EDT das Ergebnis des Vergleichs
auf SYSLST aus. Dabei gibt der EDT von jeder Zeile, für die er keine
Übereinstimmung feststellt, außer der Zeilennummer auch die ersten 51 Zeichen
des Zeileninhalts aus.

Wird LIST mit line angegeben, schreibt der EDT das Ergebnis des
Vergleichs in die aktuelle Arbeitsdatei, falls diese nicht eine der Vergleichsdateien
ist. Andernfalls wird die @COMPARE-Anweisung mit der Meldung
EDT4909 abgewiesen. Die Zeilennummernvergabe kann über die Operanden
line und inc beeinflusst werden (siehe unten). Es werden lediglich die
Nummern der Zeilen ausgegeben, für die keine Übereinstimmung vorliegt.
Die Ausgabe des Zeileninhalts unterbleibt.

Wird LIST nicht angegeben, gibt der EDT das Ergebnis im Dialogbetrieb
nach SYSOUT und im Stapelbetrieb nach SYSLST aus. Das Ausgabeformat
ist das gleiche wie bei Ausgabe in die aktuelle Arbeitsdatei.

line

Die Nummer der Zeile in der aktuellen Arbeitsdatei, in der die erste Zeile
des Vergleichsergebnisses stehen soll. Das Format, in dem der EDT das
Ergebnis in die Datei schreibt, ist gleich dem, das er bei Ausgabe auf
SYSOUT benutzt.

inc

Schrittweite, aus der die auf line folgenden Zeilennummern gebildet
werden. Wird inc nicht angegeben, wird die implizit durch line gegebene
Schrittweite verwendet (siehe Abschnitt „Implizite Schrittweitenvergabe“).

Der EDT codiert vor dem Vergleich jede Zeile intern nach UTF16 um und vergleicht die entstandenen Zeilen als Bytefolge. Die Zeilen sind gleich, wenn sowohl Zeileninhalt wie Zeilenlänge dieser Bytefolge gleich sind. Die Zeilennummern werden beim Datenvergleich nicht berücksichtigt. Wenn beide Arbeitsdateien im gleichen Zeichensatz vorliegen, ist dieses Verfahren äquivalent zu einem byteweisen Vergleich der Originalzeilen.

Die Ausgabe des Vergleichsergebnisses muss ggf. in einen geeigneten Zeichensatz umcodiert werden. Bei Ausgabe nach SYSOUT oder SYSLST ist dies der Zeichensatz, der für SYSOUT bzw. SYSLST eingestellt ist. Bei Ausgabe in die aktuelle Arbeitsdatei ist dies der für diese Arbeitsdatei eingestellte Zeichensatz. Wenn für die aktuelle Arbeitsdatei kein Zeichensatz eingestellt ist, erfolgt die Ausgabe im Zeichensatz der verglichenen Arbeitsdateien. Haben diese unterschiedliche Zeichensätze, erfolgt die Ausgabe im Zeichensatz UTFE.

Wird die Anweisung mit [K2] unterbrochen und der EDT-Lauf mit /INFORM-PROGRAM fortgesetzt, so wird die Bearbeitung der Anweisung abgebrochen und die Meldung EDT5501 ausgegeben.

Der EDT beginnt den Vergleich am Anfang der angegebenen Zeilenbereiche. Wenn der EDT ein ungleiches Zeilenpaar findet, versucht er durch vorwärts lesen innerhalb beider Dateien den nächsten Block von int2 gleichen Zeilen zu finden.

Dabei liest der EDT in jeder Datei maximal int1 Zeilen. Findet der EDT innerhalb dieses Bereichs int2 aufeinander folgende gleiche Zeilen, richtet er für den weiteren Vergleich die beiden Dateien an diesen Zeilenpaaren aus, andernfalls bricht er den Vergleich ab.

Durch geeignete Wahl von int2 kann zudem erreicht werden, dass beim Vergleich mehrere aufeinander folgende Zeilen als Einheit betrachtet werden. Dies kann etwa für Adressdateien nützlich sein, wenn eine Adressangabe aus mehreren Zeilen besteht (siehe Beispiel 2).

Wird für int2 der gleiche Wert wie für int1 gewählt, kann der EDT in den beiden Dateien keine übereinstimmenden Zeilenbereiche finden, wenn mindestens ein Zeilenpaar nicht identisch ist.

Die Ergebnisse des Vergleichs teilt der EDT in Form von kommentierten Listen von Zeilennummern mit.

Dabei wird die Gleichheit von Zeilen bzw. von Zeilenbereichen nicht gesondert ausgewiesen. Die Bereiche, für die in der jeweils anderen Datei ein übereinstimmender Bereich gefunden wurde, werden vom EDT miteinander identifiziert (sofern sie mindestens int2 Zeilen umfassen), bilden also sozusagen Paare übereinstimmender Bereiche. Diese Paarbildung ist, wenn man leere Bereiche zulässt, auch für die nicht übereinstimmenden Bereiche möglich, denn zwei benachbarte Paare übereinstimmender Bereiche werden notwendigerweise durch genau ein Paar nicht übereinstimmender Bereiche getrennt, wobei einer der trennenden Bereiche leer sein kann.

Der EDT generiert eine kommentierte Liste für jedes Paar nicht übereinstimmender Bereiche in Abhängigkeit von deren Größe und Lage:

Wenn in einem Paar nicht übereinstimmender Bereiche beide nicht leer sind, aber höchstens int1 - int2 Zeilen umfassen, werden die Bereiche als unterschiedlich ausgewiesen:

NON-MATCHING LINES
  ln       ln
   .        .
   .        .
   .       ln
  ln

Wenn in einem Paar nicht übereinstimmender Bereiche beide nicht leer sind und ein Bereich mehr als int1 - int2 Zeilen umfasst, wird die Ausgabe der obigen Liste entsprechend verkürzt und der Vergleich mit der Meldung

NOTHING SEEMS TO MATCH

abgebrochen.

Wenn in einem Paar nicht übereinstimmender Bereiche einer leer ist und der andere höchstens int1 - int2 Zeilen umfasst, wird der nicht leere Bereich als zusätzlich vorhandener Bereich ausgewiesen:

EXTRA LINES IN 1ST FILE
  ln
   .
   .
   .
  ln

Falls der nicht leere Bereich in der zweiten Datei liegt, erfolgt die Ausgabe analog mit geänderter Überschrift:

EXTRA LINES IN 2ND FILE

Wenn der nicht leere Bereich mehr als int1 - int2 Zeilen umfasst und nicht am Ende des zu vergleichenden Zeilenbereichs liegt, wird die Ausgabe der obigen Liste entsprechend verkürzt und der Vergleich mit der Meldung

NOTHING SEEMS TO MATCH

abgebrochen. Liegt der nicht leere Bereich von mehr als int1 - int2 Zeilen am Ende des zu vergleichenden Zeilenbereichs wird stattdessen die Meldung

REACHED LIMIT ON 1ST FILE

bzw.

REACHED LIMIT ON 2ND FILE

ausgegeben, wobei die Bezeichnung 1ST bzw. 2ND sich auf die Datei bezieht, die den leeren Bereich enthält.

Werden in beiden Dateien bis zum Ende des jeweiligen zu vergleichenden Zeilenbereichs keine nicht übereinstimmenden Bereiche von mehr als int1 - int2 Zeilen gefunden, wird zusätzlich der Hinweis

REACHED LIMIT ON BOTH FILES

ausgegeben, falls am Ende der zu vergleichenden Zeilenbereiche ein Paar nicht übereinstimmender Bereiche liegt. Liegt hingegen am Ende der zu vergleichenden Zeilenbereiche ein Paar übereinstimmender Bereiche wird die Meldung

REACHED LIMIT ON BOTH FILES AT SAME TIME

ausgegeben. Wenn die beiden zu vergleichenden Zeilenbereiche vollständig übereinstimmen ist dies die einzige ausgegebene Meldung.

Beispiel 1

   1.     @PROC 1
   1.     @COPY FILE=PROC-DATEI.1 --------------------------------------- (1)
   7.     @PRINT
   1.0000 AAAAAA
   2.0000 BBBBBB
   3.0000 CCCCCC
   4.0000 UUUUUU
   5.0000 VVVVVV
   6.0000 WWWWWW
   7.     @END
   1.     @PROC 2
   1.     @COPY FILE=PROC-DATEI.2 --------------------------------------- (2)
   8.     @PRINT
   1.0000 AAAAAA
   2.0000 BBBBBB
   3.0000 ZZZZZZ
   4.0000 AAAAAA
   5.0000 BBBBBB
   6.0000 CCCCCC
   7.0000 UUUUUU
   8.     @END
   1.     @COMPARE 1:1-6 WITH 2:1-7, 5(2) ------------------------------- (3)
EXTRA LINES IN 2ND FILE
               3.0000
               4.0000
               5.0000
EXTRA LINES IN 1ST FILE
   5.0000
   6.0000
REACHED LIMIT ON BOTH FILES
   1.     @COMPARE 1:1-6 WITH 2:1-7, 5(3) ------------------------------- (4)
NON-MATCHING LINES
   1.0000      1.0000
   2.0000      2.0000
   3.0000      3.0000
   4.0000      4.0000
   5.0000      5.0000
NOTHING SEEMS TO MATCH
   1.     @COMPARE 1:1-6 WITH 2:1-7, 6(3) ------------------------------- (5)
EXTRA LINES IN 2ND FILE
               1.0000
               2.0000
               3.0000
EXTRA LINES IN 1ST FILE
   5.0000
   6.0000
REACHED LIMIT ON BOTH FILES
   1.
(1) Die SAM-Datei PROC-DATEI.1 wird in die Arbeitsdatei 1 eingelesen.
(2) Die SAM-Datei PROC-DATEI.2 wird in die Arbeitsdatei 2 eingelesen.
(3)

Lassen sich bei der Betrachtung von jeweils 5 Zeilen in den beiden Dateien nicht mindestens 2 aufeinander folgende gleiche Zeilenpaare finden, soll der Vergleich abgebrochen werden. Der Vergleich wird bis zum Ende beider Dateien durchgeführt.

(4) 

Das unter (3) gegebene @COMPARE wird leicht modifiziert noch einmal gegeben. Es müssen jetzt mindestens 3 aufeinander folgende gleiche Zeilenpaare gefunden werden. Diesmal bricht der EDT den Vergleich ab.

(5) 

Das unter (4) gegebene @COMPARE wird leicht modifiziert noch einmal gegeben. Der Vergleich soll jetzt erst nach Betrachtung von 6 Zeilen abgebrochen werden. Er wird bis zum Ende durchgeführt.

Beispiel 2

Es wird vorausgesetzt, dass die Arbeitsdateien schon mit den entsprechenden Daten gefüllt sind.

 5.     @PROC 1
21.     @PRINT ------------------------------------------------------- (1)
 1.0000 Donald Duck
 2.0000 Am Dorfteich 11
 3.0000 12345 Entenhausen 
 4.0000 -
 5.0000 Dagobert Duck
 6.0000 Schlossallee 1a
 7.0000 12345 Entenhausen 
 8.0000 -
 9.0000 Daisy Duck
10.0000 Am Dorfteich 12
11.0000 12345 Entenhausen 
12.0000 -
13.0000 Gustav Gans
14.0000 Im Wiesengrund 10 
15.0000 12345 Entenhausen 
16.0000 -
17.0000 Gustav Gans
18.0000 Schmale Gasse 7
19.0000 12345 Entenhausen 
20.0000 - 
21.     @END
 5.     @PRINT ------------------------------------------------------- (2)
   1.0000 Gustav Gans
   2.0000 Im Wiesengrund 10
   3.0000 12345 Entenhausen
   4.0000 - 
   5.     @COMPARE 0:& WITH 1:&, 9999(4) ------------------------------- (3)
EXTRA LINES IN 2ND FILE
               1.0000
               2.0000
               3.0000
               4.0000
               5.0000
               6.0000
               7.0000
               8.0000
               9.0000
              10.0000
              11.0000
              12.0000
EXTRA LINES IN 2ND FILE
              17.0000
              18.0000
              19.0000
              20.0000
REACHED LIMIT ON BOTH FILES
    5.    @ON 2 CHANGE '10' TO '13' 
    5.    @COMPARE 0:& WITH 1:&, 9999(4) ------------------------------- (4)
NON-MATCHING LINES
   1.0000      1.0000
   2.0000      2.0000
   3.0000      3.0000
   4.0000      4.0000
               5.0000
               6.0000
               7.0000
               8.0000
               9.0000
              10.0000
              11.0000
              12.0000
              13.0000
              14.0000
              15.0000
              16.0000
              17.0000
              18.0000
              19.0000
              20.0000
REACHED LIMIT ON BOTH FILES
    5.
(1)Arbeitsdatei 1 wird ausgegeben. Es handelt sich um eine Adressendatei.
(2)

Nach Rückkehr aus Arbeitsdatei 1 wird Arbeitsdatei 0 ausgegeben. Sie enthält eine Adresse (4 Zeilen), nach der in der Arbeitsdatei 1 gesucht werden soll.

(3)

Die Suche wird durch einen Vergleich der beiden Arbeitsdateien realisiert. Durch Wahl von 9999 für int1 (siehe Operandenbeschreibung) wird ein Abbruch des Vergleichs verhindert. Durch Wahl von 4 für int2 wird erreicht, dass nur Bereiche mit 4 übereinstimmenden Zeilen als gleich gewertet werden. Die Ausgabe weist EXTRA LINES vor und nach einem übereinstimmenden Bereich aus, also ist die Adresse in Arbeitsdatei 1 enthalten.

(4)

Nach Modifikation der Hausnummer wird erneut gesucht. Da keine 4 aufeinander folgenden übereinstimmenden Zeilen gefunden wurden, werden nur NON-MATCHING LINES ausgewiesen. Die Adresse ist also nicht enthalten.

Vergleicht man mit @COMPARE 0:& WITH 1:&, 9999(1) statt mit @COMPARE 0:& WITH 1:&, 9999(4) erhält man sowohl für übereinstimmende Hausnummer wie für nicht übereinstimmende Hausnummer die gleiche Ausgabe, weil der EDT sich bei der ersten übereinstimmenden Zeile (12345 Entenhausen) neu synchronisiert.