在SORT中添加新列



我的输入数据如下:

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。如何做到这一点?

您有:

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和OUTREC以及OUTFIL的FIELDS的同义词-已经很复杂了,没有考虑SUM、REFORMAT上的FIELDS…)。

如果列的位置只是自然排列,则不要指定列的位置(如1:)。你只是在维护建筑。

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

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

注意:您正在"丢失"80字节记录中的6个字节。如果你的输入保证有12个尾随空格(或其他你不需要的数据,即任何使用该文件的程序都不在乎丢失),那没关系,但我们无法从你的描述中判断出来。

试着让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信息。这意味着您不能将LIKE用于该DD,请记住,添加数据会使新的LRECL有所不同。也不要在JCL中对新的LRECL进行编码。如果没有指定,SORT将插入正确的值,并且只有一个地方可以维护它。

我试过了,我做到了。

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

我的文件有80个记录长度。

相关内容

  • 没有找到相关文章

最新更新