Sorting 根据JCL中特定字段的值为该字段添加前面的零
我已经尝试将前面的零添加到JCL中的字段中 但我尝试的所有想法都不符合我的要求。 我的要求是仅当字段为数字且 仅当字段前面有空格时 输入 预期输出: 我已经尝试了几种方法,但不符合我的要求。Sorting 根据JCL中特定字段的值为该字段添加前面的零,sorting,jcl,Sorting,Jcl,我已经尝试将前面的零添加到JCL中的字段中 但我尝试的所有想法都不符合我的要求。 我的要求是仅当字段为数字且 仅当字段前面有空格时 输入 预期输出: 我已经尝试了几种方法,但不符合我的要求。 我已经查看了该查询,但它不适用于我的情况 下面是我试过的 方法1 //STEP0001 EXEC PGM=SORT //SYSOUT DD SYSOUT=*
我已经查看了该查询,但它不适用于我的情况 下面是我试过的 方法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中完成它会更好
-其他排序方法也不错。这里有一个使用SYNCSORT的可能解决方案。它也可以与DFSORT一起使用 解决方案修改为检查包含非数字字符或嵌入空格的值 该示例演示了第1-5列中包含的数字字段 “数字”仅指数字0-9。处理符号(+/-)或小数点显然会更复杂 此外,所需的大量控制语句使得此解决方案对于非常长的字段或大量字段来说不切实际 如果您可以使用的话,一个更好的选择是编写一个排序退出例程来执行数据验证和零填充 此解决方案的工作原理如下: 初始生成将创建一个临时记录,其中包含: 第1-5列:数据字段 cols6-10:数据字段的副本,将用前导零填充 第11列:指示数据字段是有效数字(空白)还是无效('I')的标志 第12列:跟踪数据字段状态的标志,在处理每个字符时更新。(空白)=处理的所有字符均为空白;('N')=已处理非空白字符;('B')=已处理非空字符后的尾随空格 对于数据字段中的每个字符,在测试时有五个I: (1) 如果字符既不是空白也不是数字,则无效标志(第11列)设置为“I” (2) 如果字符为非空,且之前处理的所有字符均为空,则状态标志(第12列)设置为“N” (3) 如果字符为空,并且已处理非空字符,则状态标志(第12列)设置为“B” (4) 如果字符为非空白字符,并且已处理尾随空白字符,则无效标志(第11列)将设置为“I”(因为数据字段包含嵌入的空白)
(5)如果字符是非空的,并且所有先前处理的字符都是空的,则数据副本(COLS 6—10)中的空白用0。 处理完所有字符后:
如果该字段为无效数字数据或空白,则使用原始数据(cols 1-5)生成输出记录 否则,输出记录将使用已填充前导零(cols 6-10)的数据构建 输出: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
我已经用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'))
如何检查字段是否为数字?我看到您正在寻找空格并将其替换为0,但我看不到您在哪里检查输入是否为数字您是对的;我错过了那个要求。解决方案已更新。谢谢谢谢你们的帮助。但这不会检查输入是否为数字,这是您原始问题的要求。是的,它不会验证输入是否为数字。但它是按照我的预期工作的。您可能应该编辑问题以删除该限制。
//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
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'))