我的输入数据是这样的:
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。 怎么做?
答案 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条记录长度。