0

我希望下面的代码也适用于输入中的可变长度数据。因此,我可以在其末尾附加双引号。我不想使用 COBOL。可能吗?

  1. ZZZZ.VVVV.FILE.CORR1 包含以下记录:-

    ABCDEFG_AAAAAA_BBB0001.csv  
    ABCDEFG_AAAAAA_BBB0002.csv  
    ABCDEFG_AAAAAA_BBB0003.csv 
    
  2. 文件 ZZZZ.VVVV.FILE.CORR2 的输出记录如下:

    r_file1="ABCDEFG_AAAAAA_BBB0001.csv"  
    r_file2="ABCDEFG_AAAAAA_BBB0002.csv"  
    r_file3="ABCDEFG_AAAAAA_BBB0003.csv" 
    

JCL代码是:

//STEPSRT5 EXEC PGM=SORT                                              
//SYSOUT   DD  SYSOUT=*                                               
//SORTIN   DD  DSN=ZZZZ.VVVV.FILE.CORR1,       <ID>
//             DISP=SHR                                               
//SORTOUT  DD  DSN=ZZZZ.VVVV.FILE.CORR2,      <OD>
//             DCB=(RECFM=FB,LRECL=80,BLKSIZE=0),                     
//             SPACE=(27920,(29,6),RLSE),                             
//             DISP=(NEW,CATLG,DELETE)                                
//SYSIN    DD  *                                                      
 SORT FIELDS=COPY                                                     
 OUTREC FIELDS=(1:C'r_file',7:SEQNUM,1,ZD,8:C'="',10:1,26,36:C'"',44X)
/*
4

2 回答 2

2
 SORT FIELDS=COPY                                                     
 INREC BUILD=(C'r_file',SEQNUM,1,ZD,C'="',5,44,80:X)
 OUTREC FINDREP=(STARTPOS=14,IN=C' ',OUT=C'"',DO=1)

顺便说一下,这不是 JCL,它们是 SORT 控制卡。您可以在您站点的 SORT 产品的手册中找到所有详细信息。

INREC/OUTREC/OUTFIL 可以只包含 BUILD、OVERLAY、IFTHEN 之一或一个或多个 IFTHEN。有两种方法可以做到这一点,因为您希望无条件使用两个函数,就像上面一样,或者使用两个 IFTHEN=(WHEN=NONE 和 IFTHEN 的函数使用部分。

你的记录是不变的。它们是固定长度的(或者您现有的代码不起作用)可能是 80 个字节(如果不是 80,请适当更改 80:X)。

请记住,您将获得超过 10 个输入记录的重复序列号(第十个将给您 r_file0)。

您还可以查看 SQZ(挤压),因为您的数据中没有嵌入空白。

于 2013-10-15T06:47:23.007 回答
1

尝试以下操作:

//STEP01   EXEC PGM=SORT
//SYSOUT   DD  SYSOUT=*
//SORTOUT  DD  SYSOUT=*
//SYSIN    DD  *
 SORT FIELDS=COPY
 INREC BUILD=(C'r_file',SEQNUM,3,CSF,C'="',1,68,C'"')
 OUTREC BUILD=(1,80,SQZ=(SHIFT=LEFT))
/*
//SORTIN   DD  *
ABCDEFG_AAAAAA_BBB0001.csv
ABCDEFG_AAAAAA_BBB0002.csv
ABCDEFG_AAAAAA_BBB0003.csv
ABCDEFG_AAAAAA_0702.csv
ABCDEFG_AAAAAA_AAAYZ0702.csv
ABCDEFG_AAAAAA_BBB.csv
ABCDEFG_AAAAAA_XXXXXXXAMY0702.csv
ABCDEFG_AAAAAA_YZ0702.csv
ABCDEFG_AAAAAA_C0702.csv
ABCDEFG_AAAAAA_0702.csv
ABCDEFG_AAAAAA_702.csv
ABCDEFG_AAAAAA_02.csv
ABCDEFG_AAAAAA_2.csv
/*
//SORTMSG DD SYSOUT=*
//

SORTOUT 将包含:

r_file1="ABCDEFG_AAAAAA_BBB0001.csv"
r_file2="ABCDEFG_AAAAAA_BBB0002.csv"
r_file3="ABCDEFG_AAAAAA_BBB0003.csv"
r_file4="ABCDEFG_AAAAAA_0702.csv"
r_file5="ABCDEFG_AAAAAA_AAAYZ0702.csv"
r_file6="ABCDEFG_AAAAAA_BBB.csv"
r_file7="ABCDEFG_AAAAAA_XXXXXXXAMY0702.csv"
r_file8="ABCDEFG_AAAAAA_YZ0702.csv"
r_file9="ABCDEFG_AAAAAA_C0702.csv"
r_file10="ABCDEFG_AAAAAA_0702.csv"
r_file11="ABCDEFG_AAAAAA_702.csv"
r_file12="ABCDEFG_AAAAAA_02.csv"
r_file13="ABCDEFG_AAAAAA_2.csv"

INREC建立一个类似的记录:

    r_file 10="ABCDEFG_AAAAAA_0702.csv                                       "

诀窍是使用CFS序列号,以便它们使用前导空格创建,这样我们就不会因为尝试修剪前导零而搞砸ZDSQZPREBLANK=C'0'去掉前导零只是行不通-它摆脱所有零,包括嵌入和尾随)

接下来OUTREC从记录中挤出空格,留下您需要的文件名。

注意:此解决方案假定您的文件名不包含嵌入的空格。如果他们这样做,还有更多的修补工作要做。

于 2013-10-16T19:45:02.723 回答