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 ( |
lines1, lines2 | Zeilenbereiche, die miteinander verglichen werden sollen. Der Operand |
int1, int2 | Über Mit Für |
LIST | Bestimmt, wohin der EDT das Ergebnis des Vergleichs ausgibt. Wird Wird Wird |
line | Die Nummer der Zeile in der aktuellen Arbeitsdatei, in der die erste Zeile |
inc | Schrittweite, aus der die auf line folgenden Zeilennummern gebildet |
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 |
(4) | Nach Modifikation der Hausnummer wird erneut gesucht. Da keine |
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.