आईबीएम DFSORT, 71, 72 या 80 वर्णों की 11 3 लाइनें
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)
स्तंभ आउटपुट प्रारूप के साथ दो उत्तर समय की कसौटी पर खरे उतरे हैं। जो मुझे एक "लूप" देता है, उस प्रकार, उस पर OUTFIL REPEAT = वर्तमान रिकॉर्ड को कॉपी करता है जो कई बार होता है।
मूल्य प्राप्त करने के लिए अलग-अलग तकनीक, जो लंबी लगती है, लेकिन छोटी है क्योंकि मैं अगले वर्ष में 12 वें रिकॉर्ड से निपटने के लिए बिना शर्त तरीके से काम नहीं कर सकता, और इसे सशर्त साधन बनाना शामिल है IFTHEN=(WHEN=
, दो बार, और कुछ अन्य सामान । झूलों पर प्राप्त करें (महीने का पहला दिन इसे करने का सबसे सरल तरीका है) गोल चक्कर (विशेष रूप से सिंटैक्स आवश्यकताओं) पर भारी खो देता है।
यह महीने के अंतिम दिन को खोजने के लिए एक इनबिल्ट फंक्शन (DFSORT में सभी फंक्शन इनबिल्ट हैं) का उपयोग करता है। फिर अगले महीने के पहले पाने के लिए एक दिन (फ़ंक्शन) जोड़ता है और पिछले रविवार को प्राप्त करने के लिए PREVDSUN फ़ंक्शन का उपयोग करता है (जो पिछले महीने में हमेशा अंतिम रविवार होगा, पहले की तरह)।
जब वर्ष (इनपुट) को वैध तिथि में बदलते हैं, तो महीने के लिए दो अंकों की अनुक्रम संख्या का उपयोग किया जाता है, और उस मूल्य को दिन के लिए भी कॉपी किया जाता है, क्योंकि शुरुआती बिंदु तब तक मायने नहीं रखता है, जब तक हम हैं। शुरू में महीने के आखिरी दिन के बाद: 5,2
की तुलना में कम हैC'01'
।
यहाँ विस्तार है:
विकल्प कॉपी - आउटपुट के लिए इनपुट फ़ाइल की प्रतिलिपि बनाएँ
OUTFIL - विभिन्न आउटपुट फ़ाइलों की अनुमति देने के लिए, अलग-अलग चयन और स्वरूपण के साथ, स्वरूपित रिपोर्ट तैयार करते हैं। INREC
के उपयोग की वजह से छोटे को प्राथमिकता दी जाती है REPEAT=
।
REPEAT = 12 - प्रत्येक रिकॉर्ड की 12 प्रतियां तैयार करें। इस उदाहरण में, SEQNUM के कारण केवल एक इनपुट रिकॉर्ड (पिछले संस्करण के विपरीत) हो सकता है।
5: - रिकॉर्ड पर कॉलम 5 से शुरू करें।
SEQNUM, 2, ZD - अनुक्रम संख्या, एक पर शुरू करने के लिए चूक, दो अंक, "ज़ोनड दशमलव" (अहस्ताक्षरित के लिए, जो वे होंगे, चरित्र के समान)।
1,8 - कॉपी बाइट्स 1 से लेकर लंबाई 8 तक वर्तमान स्थान (9)। ऐसा इसलिए है क्योंकि Y4T को यह देखने की जरूरत है कि 8, अन्यथा एक अलग दिनांक प्रारूप का उपयोग किया जाएगा।
Y4T - ccyymmdd- प्रारूप तिथि (इसके सामने 8 तुरंत होने के कारण)।
LASTDAYM - महीने का अंतिम दिन (सप्ताह, तिमाही और वर्ष का भी संभव है)।
TOJUL = - दिनांक कार्यों के लिए आउटपुट तिथि-रूपांतरण (TOJUL एक चरित्र TOGREG से कम है)
9,7 - अब जब यह 7 लंबा है, तो Y4T CCYYDDD होने जा रहा है।
ADDDAYS - कई दिनों को जोड़ता है, यदि बाद के महीने / वर्ष में स्वचालित रूप से समायोजित हो जाता है (ADDMONS और ADDYEARS भी हो सकता है)
PREVDSUN - जूलियन तिथि आती है, पिछले रविवार को स्थित है, TOGREG को सही आउटपुट स्वरूप प्राप्त करने के लिए, "-" सेपरेटर (विभाजक के रूप में आप की तरह कुछ भी हो सकता है)
12X - गंदगी को साफ करने के लिए रिक्त स्थान जिसने हमें इसे इतने कम समय में करने की अनुमति दी है
2014 के लिए ऊपर से आउटपुट है:
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
SORT को क्या करना है यह बताने के लिए कुछ आवश्यक है। कोई डिफ़ॉल्ट नहीं है। OPTION COPY
सबसे छोटा है, SORT FIELDS=COPY
समतुल्य है, लेकिन लंबा है।
यह काम खुद इस बार किया OUTFIL
(REPEAT के उपयोग की अनुमति देने के लिए)। वर्किंग कोड यकीनन 160 (2 * 80), 144 (2 * 72), 140 (72 + 69), या 138 (70 + 68) (अग्रणी रिक्त स्थान को छोड़कर, निरंतर जारी रखने और रिक्त स्थान को छोड़कर) में से कोई भी है।
यह देखते हुए कि रिसीवर को यह जानना होगा कि वे क्या कर रहे हैं, मुझे लगता है कि मैं कह सकता हूं कि 1900 से किसी भी वर्ष के लिए प्रत्येक महीने के अंतिम रविवार को सूचीबद्ध करने के लिए DFSORT कोड (वर्ष 0001 से चलेगा, लेकिन मैं इस शोध से बच रहा हूं) अच्छी तरह से) 9999 तक (हालांकि DFSORT 9999 तक वर्षों का समर्थन करता है, पिछला समाधान वर्ष 9999 में काम नहीं करेगा क्योंकि 12 वीं तारीख अगले वर्ष में चली जाती है) ट्वीट किया जा सकता है।
कोड इतना लंबा क्यों है, अगर विशेष रूप से इनबिल्ट-फ़ंक्शंस हैं?
क्षेत्र-परिभाषाएँ पंचांग हैं। एक क्षेत्र को केवल डेटा के भीतर एक विशेष स्थान के रूप में परिभाषित किया गया है (जो एक रिकॉर्ड है) इसके तत्काल उपयोग के लिए। इसे दूसरे तरीके से रखने के लिए, फ़ील्ड्स को ऐसे परिभाषित नहीं किया जाता है, बल्कि प्रत्येक उपयोग के लिए और केवल उपयोग के लिए परिभाषित किया जाता है। तिथि कार्यों को यह जानने की जरूरत है कि स्रोत के लिए किस तिथि के (कितने) स्वरूपों का उपयोग किया जाता है, और आउटपुट एक तिथि प्रारूप में होना चाहिए, ताकि इसे निर्दिष्ट किया जाना चाहिए।
अब जबकि हमारे पास जूलियन डेट है .... 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)
कुछ चाहिए JCL
//LASTSUNG EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTOUT DD SYSOUT=*
//SYSIN DD *
और एक इनपुट फ़ाइल (JCL की एक और पंक्ति और डेटा के तीन इंस्ट्रूमेंट आइटम):
//SORTIN DD *
2014
1900
2000
पैदा करता है:
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
वास्तव में वर्ष 9999 तक काम करेगा।
DFSORT IBM का मेनफ्रेम सॉर्टिंग उत्पाद है। डेटा में हेरफेर किया जा सकता है, लेकिन चूंकि छांटना कुंजी है और प्रकार अक्सर बड़े और लंबे समय तक चलने वाले होते हैं, DFSORT नियंत्रण कार्ड में कोई लूपिंग निर्माण नहीं होता है, इसलिए हम SORT को लूप में नहीं डाल सकते हैं। गोल्फ जैसे कार्यों के लिए चीजें थोड़ी लंबी हो जाती हैं।
उत्तर पोस्ट करने के लिए क्यों, क्योंकि DFSORT का एक PREVDday
फ़ंक्शन है। इसलिए एक महीने में अंतिम रविवार आसान है। यह अगले महीने के पहले दिन रविवार (PREVDSUN) है।
यह भी एक "ऑपरेंड" (OVERLAY) के भीतर करने के लिए मजेदार था, थोड़ा सा यह सब भीतर sprintf
या समान करना।
यहाँ यह अपुष्ट है:
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)
जब तक काफी दुरुपयोग नहीं होता है, यह सामान्य रूप से यह सब एक प्रयास में रटना करने के लिए प्रयास नहीं किया जाएगा, और कुछ प्रतीत होता है अनावश्यक सामान है जो यह सब एक OVERLAY में जाने की अनुमति देने के लिए आवश्यक है। गोल्फ के लिए कुछ जगह है, लेकिन चूंकि यह केवल एक लाइन को हटा देगा, इसलिए मुझे लुभा नहीं रहा है।
INREC को प्रत्येक रिकॉर्ड के लिए संसाधित किया जाता है।
ऑवरले एक मौजूदा रिकॉर्ड की सामग्री को बदलने की अनुमति देता है। यदि रिकॉर्ड प्रक्रिया में इसकी लंबाई से परे बढ़ाया जाता है, तो यह कोई समस्या नहीं है।
1,4 आने वाला वर्ष है। इसमें 0201 का शाब्दिक अर्थ संलग्न है, और फिर क्रमिक 1,8 बार इसे दोहराते हुए 96 बाइट्स की एक लंबी चक देने के लिए 11 बार दोहराता है।
विस्तारित चालू रिकॉर्ड पर 12 वें वर्ष को इसमें 1 जोड़ा गया, और इसका महीना 1 (जनवरी) कर दिया गया।
शेष 10 महीनों को 11 के माध्यम से 3 में बदल दिया जाता है।
फिर इस प्रकार की चीज़ों के कारण, रिवर्स ऑर्डर (OVERLAY के कारण) में 12 हैं:
127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
N: रिकॉर्ड पर एक कॉलम-संख्या है। एक्स एक रिक्त सम्मिलित करता है। 89,8 उस कॉलम / लंबाई से डेटा लेता है, Y4T इसे CCYYMMDD दिनांक के रूप में मानता है, PREVDSUM पिछले रविवार को काम करता है, TOGREG = Y4T (-) इसे ग्रेगोरियन YYY-MM-DD तिथि के रूप में आउटपुट करता है।
क्योंकि यदि आप किसी विशेष हिस्से के स्रोत और लक्ष्य को विनाशकारी रूप से ओवरलैप करते हैं, तो अंतिम रूप से 11:X,18,120,6X)
खराब हो जाता है और थोड़ी गड़बड़ हो जाती है।
मैनुअल और कागजात यहां देखे जा सकते हैं: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 , और इसमें 900+ पृष्ठ DFSORT एप्लीकेशन प्रोग्रामिंग गाइड शामिल है।
सभी आईबीएम उत्पादों के रूप में सभी मैनुअल मुफ्त में उपलब्ध हैं (केवल बहुत महंगे लोगों की एक छोटी राशि को छोड़कर, जो कि दुनिया में बहुत कम लोग भी समझने का नाटक करेंगे)।
सभी DFSORT नियंत्रण कार्ड एक रिक्त स्थान से शुरू होने चाहिए। कॉलम 72 केवल निरंतरता के लिए उपयोग किया जाता है (कोई भी गैर-रिक्त करेगा, लेकिन * पारंपरिक है)। कॉलम 72 के बाद एक क्रम संख्या क्षेत्र है जिसे अनदेखा किया जाता है, जिससे प्रत्येक रिकॉर्ड 80 बाइट्स हो जाता है।
समाधान के एक और जोड़े, शायद आने के लिए।