IBM DFSORT, 11 3 wiersze po 71, 72 lub 80 znaków
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)
Dwie odpowiedzi z kolumnowym formatem wyjściowym przetrwały próbę czasu. To daje mi coś w rodzaju „pętli” w OUTFIL REPEAT = tyle razy kopiuje bieżący rekord.
Inna technika, aby dojść do wartości, która wydaje się dłuższa, ale krótsza, ponieważ nie mogę wypracować żadnego bezwarunkowego sposobu poradzenia sobie z 12. rekordem z następnego roku, a uczynienie go warunkowym oznacza włączenie IFTHEN=(WHEN=
, dwa razy i kilka innych rzeczy. Zyskaj na huśtawkach (pierwszy miesiąc jest najprostszym sposobem, aby to zrobić) mocno stracić na rondach (szczególne wymagania dotyczące składni).
Używa wbudowanej funkcji (wszystkie funkcje w DFSORT są wbudowane), aby znaleźć ostatni dzień miesiąca. Następnie dodaje jeden dzień (funkcja), aby przejść do pierwszego następnego miesiąca, i używa funkcji PREVDSUN, aby uzyskać poprzednią niedzielę (która zawsze będzie ostatnią niedzielą poprzedniego miesiąca, jak poprzednio).
Podczas przekształcania roku (danych wejściowych) w prawidłową datę, dla miesiąca używany jest dwucyfrowy numer sekwencyjny, a ta wartość jest również kopiowana dla danego dnia, ponieważ punkt początkowy nie ma znaczenia tak długo, jak jest ważny, ponieważ jesteśmy po ostatnim dniu miesiąca początkowo: 5,2
jest krótszy niż C'01'
.
Oto szczegół:
OPCJA KOPIUJ - skopiuj plik wejściowy do wyjścia
OUTFIL - aby zezwolić na wiele plików wyjściowych, z różnym wyborem i formatowaniem, tworzyć sformatowane raporty. Używany zamiast krótszego INREC
ze względu na użycie REPEAT=
.
REPEAT = 12 - wyprodukuj 12 kopii każdego rekordu. W tym przykładzie może istnieć tylko jeden rekord wejściowy (w przeciwieństwie do poprzedniej wersji) z powodu SEQNUM.
5: - zacznij od kolumny 5 w rekordzie.
SEQNUM, 2, ZD - numer porządkowy, domyślnie zaczyna się od jednej, dwóch cyfr, „strefy dziesiętnej” (w przypadku znaku bez znaku, który będzie taki sam jak znak).
1,8 - skopiuj bajty 1 o długości 8 do bieżącej lokalizacji (9). Wynika to z faktu, że Y4T musi zobaczyć, że 8, w przeciwnym razie zostanie użyty inny format daty.
Y4T - data w formacie ccyymmdd (ze względu na 8 bezpośrednio przed nim).
LASTDAYM - Ostatni dzień miesiąca (możliwy również w tygodniu, kwartale i roku).
TOJUL = - wyjściowa konwersja daty dla funkcji daty (TOJUL jest o jeden znak mniejszy niż TOGREG)
9,7 - teraz, gdy ma 7 lat, Y4T będzie CCYYDDD.
ADDDAYS - dodaje liczbę dni, dostosowując się automatycznie, jeśli przejdzie do następnego miesiąca / roku (mogą to być również ADDMONS i ADDYEARS)
PREVDSUN - nadchodzi data juliańska, znajduje się poprzednia niedziela, TOGREG, aby uzyskać prawidłowy format wyjściowy, z separatorem „-” (może być czymkolwiek, co lubisz jako separatorem)
12X - puste miejsca, aby usunąć bałagan, który pozwolił nam to zrobić w tak krótkim czasie
Dane wyjściowe z powyższego na 2014 r. Wynoszą:
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
Potrzebne jest coś, aby powiedzieć SORT, co ma robić. Nie ma wartości domyślnej. OPTION COPY
jest najkrótszy, SORT FIELDS=COPY
jest równoważny, ale dłuższy.
Praca, którą wykonał tym razem OUTFIL
(aby umożliwić użycie REPEAT). Kod roboczy to prawdopodobnie dowolny ze 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) lub 138 (70 + 68) (z wyłączeniem wiodących odstępów, wymuszonej kontynuacji i końcowych odstępów).
Biorąc pod uwagę, że odbiorca musiałby wiedzieć, co robią, myślę, że mogę powiedzieć, że kod DFSORT wymienia ostatnią niedzielę każdego miesiąca dla każdego roku od 1900 roku (będzie działał od roku 0001, ale unikam badań, ponieważ cóż) do 9999 (chociaż DFSORT obsługuje lata do 9999, poprzednie rozwiązanie nie działałoby w roku 9999, ponieważ 12 data przypada na rok następny) można opublikować na Twitterze.
Dlaczego kod jest tak długi, jeśli istnieją szczególnie trafne funkcje wbudowane?
Definicje pól są efemeryczne. Pole jest zdefiniowane jako określona lokalizacja w danych (która jest rekordem) do natychmiastowego użycia. Innymi słowy, pola nie są zdefiniowane jako takie, ale są zdefiniowane dla każdego zastosowania i tylko do użytku. Funkcje daty muszą wiedzieć, które (spośród wielu) formatów daty są używane dla źródła, a dane wyjściowe muszą być w formacie daty, więc należy to określić.
Teraz, kiedy mamy randkę juliańską .... 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)
Potrzebuje trochę JCL
//LASTSUNG EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTOUT DD SYSOUT=*
//SYSIN DD *
I plik wejściowy (inny wiersz JCL i trzy elementy danych instream):
//SORTIN DD *
2014
1900
2000
Produkuje:
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
Będzie działał do 9999 roku.
DFSORT to produkt IBM do sortowania komputerów mainframe. Danymi można manipulować, ale ponieważ sortowanie jest kluczowe, a sortowanie jest często duże i długotrwałe, karty kontrolne DFSORT nie mają konstrukcji zapętlonych, więc nie możemy umieścić SORT w pętli. Sprawia, że rzeczy takie jak Golf są nieco zbyt skomplikowane.
Dlaczego publikować odpowiedź, ponieważ DFSORT ma PREVDday
funkcję. Tak więc ostatnia niedziela w miesiącu jest łatwa. Jest to poprzednia niedziela (PREVDSUN) do pierwszego dnia następnego miesiąca.
Fajnie było też robić to w jednym „operandzie” (OVERLAY), trochę tak, jakbyś robił to wszystko wewnątrz sprintf
lub podobnie.
Tutaj nie jest golfem:
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)
Chociaż nie jest to do końca nadużycie, nie byłoby w zwyczaju próbować wtłoczyć to wszystko w jedną OVERLAY, a jest kilka pozornie niepotrzebnych rzeczy, które są potrzebne, aby wszystko mogło przejść w jedną OVERLAY. Jest trochę miejsca na grę w golfa, ale ponieważ usunęłoby to co najwyżej jedną linię, nie jestem kuszony.
INREC jest przetwarzany dla każdego rekordu.
OVERLAY pozwala na zmianę treści istniejącego rekordu. Jeśli rekord zostanie przedłużony poza jego długość, nie stanowi to problemu.
Nadchodzi rok 1,4. Ma dosłownie 0201, a następnie kolejne 1,8 s powtarzają je 11 razy, aby dać jeden długi uchwyt 96 bajtów,
12. rok w rozszerzonym bieżącym rekordzie zostaje dodany do 1, a miesiąc do 1 (styczeń).
Pozostałe 10 miesięcy zmienia się na 3 do 11.
Następnie jest 12, w odwrotnej kolejności (z powodu OVERLAY) tego typu rzeczy:
127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
N: jest numerem kolumny w rekordzie. X wstawia spację. 89,8 pobiera dane z tej kolumny / długości, Y4T traktuje je jako datę CCYYMMDD, PREVDSUM opracowuje poprzednią niedzielę, TOGREG = Y4T (-) wyprowadza je jako gregoriańską datę CCYY-MM-DD.
Ponieważ dostajesz śmieci, jeśli źródło i cel konkretnej części OVERLAY nakładają się destrukcyjnie, końcowe zmiany 11:X,18,120,6X)
układają i maskują trochę bałaganu.
Podręczniki i dokumenty można znaleźć na stronie : http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 i zawierają ponad 900 stron przewodnika programowania aplikacji DFSORT.
Podobnie jak w przypadku wszystkich produktów IBM, wszystkie podręczniki są dostępne za darmo (z wyjątkiem bardzo drogiej liczby bardzo drogich, które tylko niewielka liczba ludzi na świecie mogłaby nawet udawać, że rozumie).
Wszystkie karty kontrolne DFSORT muszą zaczynać się od pustego pola. Kolumna 72 służy tylko do kontynuacji (każda niepusta wystarczy, ale * jest umowna). Po kolumnie 72 następuje obszar numeru sekwencji, który jest ignorowany, dzięki czemu każdy rekord ma 80 bajtów.
Może jeszcze kilka rozwiązań.