我的输入数据如下:
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个记录长度。