IBM DFSORT、11 71、72又は80文字の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)
円柱状の出力形式による2つの答えは、時の試練に耐えてきました。OUTFIL REPEAT =で現在のレコードを何回もコピーするという点で、「ループ」があります。
値を取得するための別の手法。これは長く見えますが、翌年の12番目のレコードを無条件に処理することができないため短くなりIFTHEN=(WHEN=
ます。スイングのゲイン(月の最初が最も簡単な方法)がラウンドアバウトで大きく失われます(特定の構文要件)。
これは組み込み関数(DFSORTのすべての関数が組み込み)を使用して、月の最終日を見つけます。次に、1日(関数)を追加して翌月の最初に到達し、PREVDSUN関数を使用して前の日曜日(常に前月の最後の日曜日になります)を取得します。
年(入力)を有効な日付に変換する場合、2桁のシーケンス番号が月に使用され、その値は日にもコピーされます。最初の月の最後の日の後:5,2
はより小さいC'01'
。
詳細は次のとおりです。
OPTION COPY-入力ファイルを出力にコピー
OUTFIL-異なる選択と書式設定で複数の出力ファイルを許可して、書式設定されたレポートを作成します。の使用のINREC
ため、より短いものに優先して使用されますREPEAT=
。
REPEAT = 12-各レコードのコピーを12個作成します。この例では、SEQNUMがあるため、入力レコードは1つだけです(以前のバージョンとは異なります)。
5:-レコードの列5から開始します。
SEQNUM、2、ZD-シーケンス番号。デフォルトは1桁、2桁、「ゾーン10進数」から始まります(符号なしの場合、文字と同じです)。
1,8-長さ8のバイト1を現在の場所(9)にコピーします。これは、Y4Tが8を確認する必要があるためです。それ以外の場合は、異なる日付形式が使用されます。
Y4T-ccyymmdd形式の日付(その直前の8のため)。
LASTDAYM-月の最終日(週、四半期、および年の可能性もあります)。
TOJUL =-日付関数の出力日付変換(TOJULはTOGREGより1文字少ない)
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)のいずれかです(先行ブランク、強制継続、および後続ブランクを除く)。
受信者が何をしているのかを知る必要があることを考えると、DFSORTコードは1900年以降の各月の最後の日曜日をリストするために言うことができると思います(0001年から実行されますが、まあ)最大9999(DFSORTは最大9999年をサポートしますが、12日目が翌年になるため、以前のソリューションは9999年には機能しません)をツイートできます。
特に適切な組み込み関数がある場合、なぜコードはそれほど長いのですか?
フィールド定義は短命です。フィールドは、すぐに使用できるように、データ内の特定の場所(レコード)としてのみ定義されます。別の言い方をすれば、フィールドはそのように定義されていませんが、使用ごとに定義されており、使用のみを目的としています。日付関数は、(多くの)日付のどの形式がソースに使用されているかを知る必要があり、出力は日付形式である必要があるため、指定する必要があります。
ユリウス日ができたので... 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の別の行と3つのインストリームデータ):
//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)です。
1つの「オペランド」(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)
完全に乱用するわけではありませんが、これらすべてを1つのOVERLAYに詰め込むことは普通ではありません。ゴルフの余地はありますが、せいぜい1行しか削除されないので、私は誘惑されません。
INRECはレコードごとに処理されます。
OVERLAYを使用すると、既存のレコードのコンテンツを変更できます。レコードがプロセス内でその長さを超えて拡張される場合、それは問題ではありません。
1,4は来た年です。0201のリテラルが追加され、その後連続する1,8が11回繰り返されて96バイトの1つの長いチャックが得られます。
拡張された現在のレコードの12年目には1が追加され、その月は1(1月)になります。
残りの10か月は3〜11に変更されます。
次に、これらのタイプの12が逆の順序(オーバーレイによる)にあります。
127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),
n:はレコードの列番号です。Xは空白を挿入します。89,8はその列/長さからデータを取得し、Y4TはそれをCCYYMMDD日付として扱い、PREVDSUMは前の日曜日を計算し、TOGREG = Y4T(-)はグレゴリオ暦CCYY-MM-DD日付として出力します。
OVERLAYの特定の部分のソースとターゲットが破壊的にオーバーラップするとゴミが出るので、最終的には11:X,18,120,6X)
少し混乱し、再配置されます。
マニュアルおよびペーパーは、http://www-01.ibm.com/support/docview.wss?uid = isg3T7000080にあり、900ページ以上のDFSORTアプリケーションプログラミングガイドが含まれています。
すべてのIBM製品と同様に、すべてのマニュアルは無料で入手できます(ただし、世界のごく少数の人しか理解できないふりをする、非常に高価なものを除きます)。
すべてのDFSORTコントロールカードは、空白で始まる必要があります。72桁目は、継続のためにのみ使用されます(非ブランクでもかまいませんが、*は従来のものです)。列72には、無視されるシーケンス番号領域が続き、各レコードを80バイトにします。
おそらくもう1つの解決策があります。