IBM DFSORT, 11 3 Zeilen mit 71, 72 oder 80 Zeichen
OPTION COPY
OUTFIL REPEAT=12,OVERLAY=(5:SEQNUM,2,ZD,5,2,1,8,Y4T,LASTDAYM,TOJUL=Y4T*
,9,7,Y4T,ADDDAYS,+1,TOJUL=Y4T,1:16,7,Y4T,PREVDSUN,TOGREG=Y4T(-),12X)
Die beiden Antworten mit kolumnarem Ausgabeformat haben sich bewährt. Das gibt mir eine Art "Schleife", in der bei OUTFIL REPEAT = der aktuelle Datensatz so oft kopiert wird.
Eine andere Technik, um zum Wert zu gelangen, die länger zu sein scheint, aber kürzer ist, da ich keinen unbedingten Weg finden kann, um mit der 12. Platte des folgenden Jahres umzugehen IFTHEN=(WHEN=
. Gewinne auf den Schaukeln (der erste Monat ist der einfachste Weg, dies zu tun) verlieren stark an den Kreisverkehren (besondere Syntaxanforderungen).
Dies verwendet eine eingebaute Funktion (alle Funktionen in DFSORT sind eingebaut), um den letzten Tag des Monats zu finden. Fügt dann einen Tag (Funktion) hinzu, um zum ersten des folgenden Monats zu gelangen, und verwendet die PREVDSUN-Funktion, um den vorherigen Sonntag zu erhalten (der wie zuvor immer der letzte Sonntag im vorherigen Monat sein wird).
Wenn das Jahr (Eingabe) in ein gültiges Datum umgewandelt wird, wird eine zweistellige laufende Nummer für den Monat verwendet, und dieser Wert wird auch für den Tag kopiert, da der Startpunkt keine Rolle spielt, solange er gültig ist, wie wir es sind nach dem letzten tag des monats anfänglich: 5,2
ist kürzer als C'01'
.
Hier ist das Detail:
OPTION COPY - Kopiert die Eingabedatei in die Ausgabe
OUTFIL - Damit mehrere Ausgabedateien mit unterschiedlicher Auswahl und Formatierung formatierte Berichte erstellen können. Wird INREC
wegen der Verwendung von bevorzugt dem kürzeren vorgezogen REPEAT=
.
REPEAT = 12 - 12 Kopien jedes Datensatzes erstellen. In diesem Beispiel kann es aufgrund der SEQNUM (im Gegensatz zur vorherigen Version) nur einen Eingabedatensatz geben.
5: - Beginnen Sie in Spalte 5 des Datensatzes.
SEQNUM, 2, ZD - Sequenznummer, beginnt standardmäßig mit einer, zwei Ziffern, "Zonendezimal" (für vorzeichenlose Zeichen, die mit dem Zeichen identisch sind).
1,8 - Byte 1 für Länge 8 zum aktuellen Speicherort kopieren (9). Dies liegt daran, dass der Y4T diese 8 sehen muss, ansonsten wird ein anderes Datumsformat verwendet.
Y4T - Datum im ccyymmdd-Format (aufgrund der 8 direkt davor).
LASTDAYM - Letzter Tag des Monats (auch möglich für Woche, Quartal und Jahr).
TOJUL = - Datumsumwandlung für Datumsfunktionen ausgeben (TOJUL ist ein Zeichen weniger als TOGREG)
9,7 - jetzt, da es 7 ist, wird Y4T CCYYDDD sein.
ADDDAYS - Fügt eine Anzahl von Tagen hinzu und passt sich automatisch an, wenn in den folgenden Monat / das folgende Jahr übergegangen wird (dies können auch ADDMONS und ADDYEARS sein).
PREVDSUN - das julianische Datum kommt herein, der vorherige Sonntag ist lokalisiert, TOGREG, um das richtige Ausgabeformat zu erhalten, mit dem Trennzeichen "-" (kann alles sein, was Sie als Trennzeichen mögen)
12X - Lücken, um das Chaos zu beseitigen, das es uns ermöglicht hat, es auf so kurze Weise zu tun
Die Ergebnisse für 2014 lauten wie folgt:
2014-01-26
2014-02-23
2014-03-30
2014-04-27
2014-05-25
2014-06-29
2014-07-27
2014-08-31
2014-09-28
2014-10-26
2014-11-23
2014-12-28
Es ist etwas erforderlich, um der SORT zu sagen, was zu tun ist. Es gibt keine Standardeinstellung. OPTION COPY
ist die kürzeste, SORT FIELDS=COPY
entspricht aber länger.
Die Arbeit selbst erledigte es diesmal in OUTFIL
(um die Verwendung von REPEAT zu ermöglichen). Der Arbeitscode ist wahrscheinlich einer von 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) oder 138 (70 + 68) (ohne die führenden Leerzeichen, erzwungenen Fortsetzungs- und nachfolgenden Leerzeichen).
Angesichts der Tatsache, dass der Empfänger wissen müsste, was er tut, kann ich sagen, dass der DFSORT - Code den letzten Sonntag eines jeden Monats für jedes Jahr ab 1900 auflistet (ab dem Jahr 0001), aber ich vermeide die Forschung als gut) bis 9999 (obwohl DFSORT Jahre bis 9999 unterstützt, würde die vorherige Lösung im Jahr 9999 nicht funktionieren, da das 12. Datum in das folgende Jahr fällt) kann getwittert werden.
Warum ist der Code so lang, wenn es besonders geeignete eingebaute Funktionen gibt?
Felddefinitionen sind kurzlebig. Ein Feld wird nur als eine bestimmte Position innerhalb der Daten (die ein Datensatz ist) für die sofortige Verwendung definiert. Anders ausgedrückt, Felder sind nicht als solche definiert, sondern werden für jede Verwendung und nur für die Verwendung definiert. Datumsfunktionen müssen wissen, welche (von vielen) Datumsformaten für die Quelle verwendet werden, und die Ausgabe muss in einem Datumsformat erfolgen, sodass angegeben werden muss.
Jetzt, wo wir ein julianisches Date haben ... TBC?
OPTION COPY
INREC OVERLAY=(1,4,C'0201',1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8*
,94:C'1',89:1,4,ZD,ADD,+1,ZD,LENGTH=4,14:C'3',22:C'4',30:C'5',38:C'6',*
46:C'7',54:C'8',62:C'9',69:C'10',77:C'11',85:C'12',127:X,89,8,Y4T,PREV*
DSUN,TOGREG=Y4T(-),116:X,81,8,Y4T,PREVDSUN,TOGREG=Y4T(-),105:X,73,8,Y4*
T,PREVDSUN,TOGREG=Y4T(-),94:X,65,8,Y4T,PREVDSUN,TOGREG=Y4T(-),83:X,57,*
8,Y4T,PREVDSUN,TOGREG=Y4T(-),72:X,49,8,Y4T,PREVDSUN,TOGREG=Y4T(-),61:X*
,41,8,Y4T,PREVDSUN,TOGREG=Y4T(-),50:X,33,8,Y4T,PREVDSUN,TOGREG=Y4T(-),*
39:X,25,8,Y4T,PREVDSUN,TOGREG=Y4T(-),28:X,17,8,Y4T,PREVDSUN,TOGREG=Y4T*
(-),17:X,09,8,Y4T,PREVDSUN,TOGREG=Y4T(-),1:1,8,Y4T,PREVDSUN,TOGREG=Y4T*
(-),11:X,18,120,6X)
Braucht welche JCL
//LASTSUNG EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTOUT DD SYSOUT=*
//SYSIN DD *
Und eine Eingabedatei (eine weitere Zeile der JCL und drei Instream-Datenelemente):
//SORTIN DD *
2014
1900
2000
Produziert:
2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28
1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30
2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31
Funktioniert tatsächlich bis zum Jahr 9999.
DFSORT ist das Mainframe-Sortierprodukt von IBM. Daten können manipuliert werden, aber da die Sortierung von entscheidender Bedeutung ist und die Sortierung häufig langwierig und umfangreich ist, verfügen die DFSORT-Steuerkarten über keine Schleifenkonstrukte. Daher können wir eine SORT nicht in eine Schleife einfügen. Macht die Dinge für Aufgaben wie Golf etwas langatmig.
Warum die Antwort posten, liegt daran, dass DFSORT eine PREVDday
Funktion hat. So ist letzter Sonntag in einem Monat einfach. Es ist der Sonntag vor (PREVDSUN) dem ersten Tag des folgenden Monats.
Es hat auch Spaß gemacht, es in einem "Operanden" (OVERLAY) zu machen, ein bisschen wie alles in einem sprintf
oder ähnlichem.
Hier ist es ungolfed:
OPTION COPY
INREC OVERLAY=(1,4,C'0201',1,8,1,8,1,8,1,8,1,8,1,8,
1,8,1,8,1,8,1,8,
1,8,94:C'1',89:1,4,ZD,ADD,+1,ZD,LENGTH=4,
14:C'3',22:C'4',30:C'5',38:C'6',46:C'7',54:C'8',
62:C'9',69:C'10',77:C'11',85:C'12',
127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
116:X,81,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
105:X,73,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
94:X,65,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
83:X,57,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
72:X,49,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
61:X,41,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
50:X,33,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
39:X,25,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
28:X,17,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
17:X,09,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
1:1,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
11:X,18,120,6X)
Es ist zwar kein Missbrauch, aber es wäre nicht üblich, zu versuchen, dies alles in ein OVERLAY zu packen, und es gibt einige scheinbar unnötige Dinge, die erforderlich sind, damit alles in ein OVERLAY passt. Es gibt etwas Platz zum Golfen, aber da es höchstens eine Linie entfernen würde, bin ich nicht versucht.
Die INREC wird für jeden Datensatz verarbeitet.
Mit OVERLAY kann der Inhalt eines vorhandenen Datensatzes geändert werden. Wenn der Datensatz dabei über seine Länge hinaus verlängert wird, ist dies kein Problem.
1,4 ist das kommende Jahr. Es wird das Literal 0201 angehängt, und die nachfolgenden 1,8 wiederholen es elf Mal, um ein langes Chuck mit 96 Bytes zu erhalten.
Das 12. Jahr des erweiterten aktuellen Datensatzes wird um 1 erhöht und der Monat auf 1 (Januar) gesetzt.
Die verbleibenden 10 Monate werden in 3 bis 11 geändert.
Dann gibt es 12 in umgekehrter Reihenfolge (aufgrund von OVERLAY) dieser Art von Dingen:
127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
Das n: ist eine Spaltennummer im Datensatz. Das X fügt ein Leerzeichen ein. 89,8 nimmt die Daten aus dieser Spalte / Länge, Y4T behandelt sie als CCYYMMDD-Datum, PREVDSUM berechnet den vorherigen Sonntag, TOGREG = Y4T (-) gibt sie als gregorianisches CCYY-MM-DD-Datum aus.
Weil Sie Müll bekommen, wenn sich die Quelle und das Ziel eines bestimmten Teils eines OVERLAYs zerstörerisch überlappen, ordnet sich das Endergebnis 11:X,18,120,6X)
neu und maskiert ein bisschen Chaos.
Handbücher und Dokumente finden Sie unter: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 . Enthält das 900-seitige DFSORT Application Programming Guide.
Wie bei allen IBM Produkten sind alle Handbücher kostenlos erhältlich (mit Ausnahme einer unglaublich kleinen Menge sehr teurer Handbücher, die nur eine sehr kleine Anzahl von Menschen auf der Welt zu verstehen vorgibt).
Alle DFSORT-Steuerkarten müssen mit einem Leerzeichen beginnen. Die Spalte 72 wird nur zur Fortsetzung verwendet (jedes Nicht-Leerzeichen reicht aus, aber * ist konventionell). Auf die Spalte 72 folgt ein Sequenznummernbereich, der ignoriert wird, so dass jeder Datensatz 80 Bytes umfasst.
Vielleicht noch ein paar Lösungen.