我尝试在JCL中的字段中添加前面的零 但我尝试的所有想法都不符合我的要求。 我的要求是只在字段为数字时才添加前面的零 只有当字段有前面的空格时。
输入 Sample Input
123457 0 | 34567R | 997654D3 | 45833| 23 | 112456| 56 64 |
预期输出 Sample output
123457 0 | 34567R | 997654D3 | 000045833| 23 | 000112456| 56 64 |
我已经尝试了一些方法,但没有达到我的要求 我查看过查询Add zero padding to string in JCL,但在我的情况下不适用。
以下是我的尝试
方法1
//STEP0001 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SYMNAMES DD *
ALPHA,C'A, ,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z'
//SORTIN DD *
123457 0
34567R
997654D3
45833
23
//SORTOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
INREC IFTHEN=(WHEN=(01,01,SS,EQ,ALPHA,OR,02,01,SS,EQ,ALPHA,OR,
03,01,SS,EQ,ALPHA,OR,04,01,SS,EQ,ALPHA,OR,
05,01,SS,EQ,ALPHA,OR,06,01,SS,EQ,ALPHA,OR,
07,01,SS,EQ,ALPHA,OR,08,01,SS,EQ,ALPHA,OR,
09,01,SS,EQ,ALPHA,OR,10,01,SS,EQ,ALPHA),
BUILD=(1,10)),
IFTHEN=(WHEN=NONE,BUILD=(1,10,UFF,M11,LENGTH=10))
//
方法2
//STEP0001 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD *
123457 0
34567
997654
4568 F ABC
23 1 1
//SORTOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
INREC IFOUTLEN=50,IFTHEN=(WHEN=INIT,OVERLAY=(51:1,10,TRAN=ALTSEQ)),
IFTHEN=(WHEN=(51,10,FS,EQ,NUM),OVERLAY=(1:1,10,UFF,M11,LENGTH=10))
ALTSEQ CODE=(40F0)
/*
方法3
//STEP001 EXEC PGM=SORT
//SORTIN DD *
764536 27
0097865432
00065499234
00012342345
12301231233
//SORTOUT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
INREC BUILD=(1,11,UFF,M11,LENGTH=11)
//
注意:
- 如果我们能在ICETOOL中做到这一点会更好
- 其他排序方法也没问题。
答案 0 :(得分:1)
这是使用SYNCSORT的可能解决方案。它也可以与DFSORT一起使用。
修改了解决方案以检查包含非数字字符或嵌入空格的值。
该示例说明了第1 - 5列中包含的数字字段。
"数字"假设仅表示数字0-9。处理标志(+/-)或小数点显然会更复杂。
此外,所需的大量控制语句使得此解决方案对于非常长的字段或大量字段而言不切实际。
如果可以使用的话,更好的选择是写一个排序例程来执行数据验证和零填充。
此解决方案的工作原理如下:
初始BUILD创建一个包含以下内容的临时记录:
cols 1 - 5:数据字段
cols 6 - 10:数据字段的副本,将用前导零填充
col 11:一个标志,指示数据字段是有效数字(空白)还是无效(' I')
col 12:跟踪数据字段状态的标志,在处理每个字符时更新。 (空白)=处理的所有字符都是空白的; (' N')=已处理非空白字符; (' B')=处理非空白字符后的尾随空白。
对于数据字段中的每个字符,有五个IFTHEN测试:
(1)如果该字符既不是空白也不是数字,则无效标志(第11栏)设置为“我”。
(2)如果该字符为非空白,且之前处理的所有字符均为空白,则状态标记(第12列)设置为“N'
(3)如果字符为空白,并且处理了非空白字符,则状态标志(第12栏)设置为' B'
(4)如果该字符是非空白的,并且处理了一个尾随的空白字符,则无效标志(第11列)被设置为“我”。 (因为数据字段包含嵌入的空白)。
(5)如果该字符为非空白,并且之前处理的所有字符均为空白,则数据副本(第6-10列)中的空白将替换为零。
处理完所有字符后:
如果该字段是无效数字数据或空白,则使用原始数据构建输出记录(第1 - 5栏)。
否则,输出记录是使用已用前导零(cols 6 - 10)填充的数据构建的。
//STEP1 EXEC PGM=SYNCSORT
//SYSOUT DD SYSOUT=*
//SORTIN DD *
1
1
1
1
1
12
12
12
12
123
123
123
1234
1234
12345
1 2
1 2
1 2
1 23
1 23
12 3
12 3
X
X
X
X
X
1X
X1
1X
1X
12X
12X
1X3
12X4
X234
12X45
/*
//SORTOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
INREC IFTHEN=(WHEN=INIT,
BUILD=(1,5,1,5,C' ')),
IFTHEN=(WHEN=(1,1,CH,NE,C' ',AND,1,1,FS,NE,NUM),
OVERLAY=(11:C'I'),
HIT=NEXT),
IFTHEN=(WHEN=(1,1,CH,NE,C' ',AND,12,1,CH,EQ,C' '),
OVERLAY=(12:C'N'),
HIT=NEXT),
IFTHEN=(WHEN=(1,1,CH,EQ,C' ',AND,12,1,CH,EQ,C'N'),
OVERLAY=(12:C'B'),
HIT=NEXT),
IFTHEN=(WHEN=(1,1,CH,NE,C' ',AND,12,1,CH,EQ,C'B'),
OVERLAY=(11:C'I'),
HIT=NEXT),
IFTHEN=(WHEN=(1,1,CH,EQ,C' ',AND,12,1,CH,EQ,C' '),
OVERLAY=(6:C'0'),
HIT=NEXT),
IFTHEN=(WHEN=(2,1,CH,NE,C' ',AND,2,1,FS,NE,NUM),
OVERLAY=(11:C'I'),
HIT=NEXT),
IFTHEN=(WHEN=(2,1,CH,NE,C' ',AND,12,1,CH,EQ,C' '),
OVERLAY=(12:C'N'),
HIT=NEXT),
IFTHEN=(WHEN=(2,1,CH,EQ,C' ',AND,12,1,CH,EQ,C'N'),
OVERLAY=(12:C'B'),
HIT=NEXT),
IFTHEN=(WHEN=(2,1,CH,NE,C' ',AND,12,1,CH,EQ,C'B'),
OVERLAY=(11:C'I'),
HIT=NEXT),
IFTHEN=(WHEN=(2,1,CH,EQ,C' ',AND,12,1,CH,EQ,C' '),
OVERLAY=(7:C'0'),
HIT=NEXT),
IFTHEN=(WHEN=(3,1,CH,NE,C' ',AND,3,1,FS,NE,NUM),
OVERLAY=(11:C'I'),
HIT=NEXT),
IFTHEN=(WHEN=(3,1,CH,NE,C' ',AND,12,1,CH,EQ,C' '),
OVERLAY=(12:C'N'),
HIT=NEXT),
IFTHEN=(WHEN=(3,1,CH,EQ,C' ',AND,12,1,CH,EQ,C'N'),
OVERLAY=(12:C'B'),
HIT=NEXT),
IFTHEN=(WHEN=(3,1,CH,NE,C' ',AND,12,1,CH,EQ,C'B'),
OVERLAY=(11:C'I'),
HIT=NEXT),
IFTHEN=(WHEN=(3,1,CH,EQ,C' ',AND,12,1,CH,EQ,C' '),
OVERLAY=(8:C'0'),
HIT=NEXT),
IFTHEN=(WHEN=(4,1,CH,NE,C' ',AND,4,1,FS,NE,NUM),
OVERLAY=(11:C'I'),
HIT=NEXT),
IFTHEN=(WHEN=(4,1,CH,NE,C' ',AND,12,1,CH,EQ,C' '),
OVERLAY=(12:C'N'),
HIT=NEXT),
IFTHEN=(WHEN=(4,1,CH,EQ,C' ',AND,12,1,CH,EQ,C'N'),
OVERLAY=(12:C'B'),
HIT=NEXT),
IFTHEN=(WHEN=(4,1,CH,NE,C' ',AND,12,1,CH,EQ,C'B'),
OVERLAY=(11:C'I'),
HIT=NEXT),
IFTHEN=(WHEN=(4,1,CH,EQ,C' ',AND,12,1,CH,EQ,C' '),
OVERLAY=(9:C'0'),
HIT=NEXT),
IFTHEN=(WHEN=(5,1,CH,NE,C' ',AND,5,1,FS,NE,NUM),
OVERLAY=(11:C'I'),
HIT=NEXT),
IFTHEN=(WHEN=(5,1,CH,NE,C' ',AND,12,1,CH,EQ,C' '),
OVERLAY=(12:C'N'),
HIT=NEXT),
IFTHEN=(WHEN=(5,1,CH,EQ,C' ',AND,12,1,CH,EQ,C'N'),
OVERLAY=(12:C'B'),
HIT=NEXT),
IFTHEN=(WHEN=(5,1,CH,NE,C' ',AND,12,1,CH,EQ,C'B'),
OVERLAY=(11:C'I'),
HIT=NEXT),
IFTHEN=(WHEN=(5,1,CH,EQ,C' ',AND,12,1,CH,EQ,C' '),
OVERLAY=(10:C'0'),
HIT=NEXT),
IFTHEN=(WHEN=(11,1,CH,EQ,C'I',OR,12,1,CH,EQ,C' '),
BUILD=(1,5)),
IFTHEN=(WHEN=(11,1,CH,NE,C'I',AND,12,1,CH,NE,C' '),
BUILD=(6,5))
/*
输出:
00001
0001
001
01
1
00012
0012
012
12
00123
0123
123
01234
1234
12345
1 2
1 2
1 2
1 23
1 23
12 3
12 3
X
X
X
X
X
1X
X1
1X
1X
12X
12X
1X3
12X4
X234
12X45
答案 1 :(得分:0)
我找到了使用SORT的问题的解决方案。
OPTION COPY
INREC IFTHEN=(WHEN=(13,12,CH,EQ,C' '),OVERLAY=(13:C'000000000000')),
IFTHEN=(WHEN=(13,11,CH,EQ,C' '),OVERLAY=(13:C'00000000000')),
IFTHEN=(WHEN=(13,10,CH,EQ,C' '),OVERLAY=(13:C'0000000000')),
IFTHEN=(WHEN=(13,09,CH,EQ,C' '),OVERLAY=(13:C'000000000')),
IFTHEN=(WHEN=(13,08,CH,EQ,C' '),OVERLAY=(13:C'00000000')),
IFTHEN=(WHEN=(13,07,CH,EQ,C' '),OVERLAY=(13:C'0000000')),
IFTHEN=(WHEN=(13,06,CH,EQ,C' '),OVERLAY=(13:C'000000')),
IFTHEN=(WHEN=(13,05,CH,EQ,C' '),OVERLAY=(13:C'00000')),
IFTHEN=(WHEN=(13,04,CH,EQ,C' '),OVERLAY=(13:C'0000')),
IFTHEN=(WHEN=(13,03,CH,EQ,C' '),OVERLAY=(13:C'000')),
IFTHEN=(WHEN=(13,02,CH,EQ,C' '),OVERLAY=(13:C'00')),
IFTHEN=(WHEN=(13,01,CH,EQ,C' '),OVERLAY=(13:C'0'))