在SORT中添加新列

时间:2015-02-26 07:38:23

标签: mainframe jcl syncsort dfsort

我的输入数据是这样的:

trainnumber name   station     price  coach seats

16001 CHN-CENTRAL PALANI      400.00 AC  02 

16002 PALANI      CHN-CENTRAL 410.00 ORD 76 

16003 CHN-CENTRAL NAGARKOIL   425.00 AC  30 

16004 NAGARKOIL   CHN-CENTRAL 439.00 SLP 37 

16005 THANJAVUR   CHN-EGMORE  395.00 ORD 60 

16006 CHN-EGMORE  THANJAVUR   375.00 SLP 10

我想在列车编号之前添加一个新列,其中包含一个四位数的序列号,后面跟一个空格,并在我的列车编号上加1。 怎么做?

2 个答案:

答案 0 :(得分:1)

你有:

SORT FIELDS=COPY                                      
OUTREC FIELDS=(1:SEQNUM,4,ZD,X,6:1,5,ZD,ADD,+1,EDIT=(TTTTT),
  X,12:7,69)

简化为:

OPTION COPY                                      
INREC BUILD=(SEQNUM,4,ZD,
             X,
             1,5,ZD,
              ADD,+1,
               EDIT=(TTTTT),
             X,
             7,69)

OUTREC在SORT / MERGE之后运行。 INREC在SORT / MERGE之前运行。既然你没有做SORT或MERGE(你正在做COPY)那没关系,但是INREC是更合乎逻辑的选择。

FIELDS过载(请参阅文档确认)并且由于存在BUILD,因此INREC或OUTREC不需要FIELDS(OUTFIL上不需要OUTREC)因为BUILD执行相同的工作但没有可能的混淆(BUILD是INREC上的FIELDS和OUTFIL上的OUTREC和OUTREC的同义词 - 已经很复杂,没有考虑SUM上的FIELDS,REFORMAT ......)。

如果位置只是自然排列,请不要指定列位置(如1 :)。你刚刚建立维护。

BUILD(甚至是丑陋的FIELDS)的默认起点是1:。下一个字段的默认值紧跟在当前字段之后。您已使用X作为列的间距,因此所有数据都与先前的数据相邻。使用列只会使它复杂化。

注意:你有X,7,69。您可以考虑将其更改为6,69,因为您输入的位置6为空白。

注意:您正在“丢失”80字节记录的六个字节。如果您的输入有保证的十二个尾随空白(或您不需要的其他数据,即使用该文件的任何程序都不关心该丢失)那么这没关系,但我们无法从您的描述中看出。

尝试让您的SORT控制卡更易于阅读(尝试让所有内容更易于阅读)。它将节省时间并减少错误。这意味着更便宜。时间就是金钱。


假设您的意思是SORT,而您的“列”不适用于DB2 ....

对于定长记录:

OPTION COPY
INREC BUILD=(5X,1,your-lrecel)

BUILD将创建一个新的当前记录,替换原始记录。它将从五个空白(5X)开始,但你可以放在任何你喜欢的任何大小(在产品的限制范围内,大)。将你的lrecl更改为实际的LRECL值。

对于可变长度记录:

OPTION COPY
INREC BUILD=(1,4,5X,5)

1,4是记录描述符字,在创建新的当前记录时始终需要复制RDW。复制后,SORT将确保前两个字节(记录长度)中包含的值是正确的。然后新的列,在示例中再次是五个空白,然后是可变长度记录的其余部分,这只是通过使用起始位置(这里是五个,以获取数据的第一个字节)来指定,并且隐含地继续到记录结束。

在您的实际JCL中(以上都不是JCL,它是SORT控制卡),请确保您没有为SORTOUT指定任何DCB信息。这意味着您不能对该DD使用LIKE,请记住添加数据会使新LRECL不同。不要在JCL中编写新的LRECL代码。如果没有指定,SORT将插入正确的值,并且只有一个地方可以维护它。

答案 1 :(得分:0)

我尝试过这样做,我做到了。

  SORT FIELDS=COPY                                      
  OUTREC FIELDS=(1:SEQNUM,4,ZD,X,6:1,5,ZD,ADD,+1,EDIT=(TTTTT),
    X,12:7,69) 

我的文件是80条记录长度。