在 SORT 中添加新列

Posted

技术标签:

【中文标题】在 SORT 中添加新列【英文标题】:Adding a new column in SORT 【发布时间】:2015-02-26 07:38:22 【问题描述】:

我的输入数据是这样的:

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 添加到我的火车号。 如何做到这一点?

【问题讨论】:

我假设您所说的“JCL”是指您的 SORT 产品? 是的,按排序,我必须这样做我需要添加长度为 4 的新列(序列号列),我需要在我的火车号上加 1 怎么做? 对您之前的问题的一些回应会很好。您应该考虑对您认为有帮助的答案进行投票,并且在这里您应该接受对您最有帮助的答案,即使它是您的。这可以帮助将来搜索此类问题。 【参考方案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 上的 FIELDS 和 OUTFIL 上的 OUTREC 的同义词 - 已经很复杂了,不考虑 SUM 上的 FIELDS、REFORMAT...)。

如果位置只是自然排列,则不要指定列位置(如 1:)。您只是在进行维护。

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

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

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

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


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

对于固定长度的记录:

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

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

对于可变长度记录:

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

1,4是Record Descriptor Word,在创建新的当前记录时总是需要复制一个RDW。复制后,SORT 将确保前两个字节(记录长度)中包含的值是正确的。然后是新列,在示例中也是五个空白,然后是可变长度记录的其余部分,它通过使用起始位置(此处为五个,用于获取数据的第一个字节)简单地指定,并且隐含地继续到记录结束。

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

【讨论】:

【参考方案2】:

我试过这样,我做到了。

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

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

【讨论】:

以上是关于在 SORT 中添加新列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Sequelize CLI 中添加、删除新列

在迁移中向现有表添加新列

如何在 laravel 中获取所有模型/迁移名称并添加单个新列

如何在 CSV 文件中添加新列?

在文件中添加新列

在一个命令中添加具有外键约束的新列