You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用DFSORT按年份降序排序记录组(组内不排序)

DFSORT按年份降序排序记录组问题

需求说明

  • 使用DFSORT对记录组按年份降序排序
  • 年份信息固定位于匹配000010YY的记录中,紧随该字符串之后的4位数字为年份
  • 仅对整个年份组进行排序,组内记录保持原有顺序不做排序
  • 输入、输出文件均为FB格式,LRECL=80

输入示例

12345 5555 000010YY2021j020
12345 5555 000020AB
12345 5555 000130BC
12345 5555 000141BT01
12345 5555 000143BT05
12356 5555 000010YY2022j020
12356 5555 000020AB  
12356 5555 000130BC  
12356 5555 000141BT01
12367 5555 000010YY2023j020
12367 5555 000130AB
12367 5555 000020BC
12378 5555 000010YY2018j020
12378 5555 000020AB    
12378 5555 000130BC    
12378 5555 000141BT01  
12378 5555 000143BT05
12379 5555 000010YY2017j020
12379 5555 000020AB    
12379 5555 000130BC    

预期输出示例

12367 5555 000010YY2023j020
12367 5555 000130AB
12367 5555 000020BC
12356 5555 000010YY2022j020
12356 5555 000020AB        
12356 5555 000130BC  
12356 5555 000141BT01
12345 5555 000010YY2021j020
12345 5555 000020AB
12345 5555 000130BC
12345 5555 000141BT01
12345 5555 000143BT05
12378 5555 000010YY2018j020
12378 5555 000020AB    
12378 5555 000130BC    
12378 5555 000141BT01  
12378 5555 000143BT05
12379 5555 000010YY2017j020
12379 5555 000020AB    
12379 5555 000130BC

尝试过的代码(未得到预期结果)

//SYSIN DD *                                              
  INREC IFTHEN=(WHEN=GROUP,BEGIN=(12,8,CH,EQ,C'000010YY'),
  PUSH=(81:ID=8))                                       
  SORT FIELDS=(81,8,ZD,D,1,10,BI,A)
  OUTREC BUILD=(1,80)                                   
/*

问题分析与解决方案

问题原因

原代码存在两个核心问题:

  1. 未提取年份作为排序依据,仅靠组ID无法实现按年份降序分组
  2. 排序时加入了前10字节的升序排序,会打乱组内原有记录顺序

正确代码

//SYSIN DD *
  INREC IFTHEN=(WHEN=GROUP,
               BEGIN=(12,8,CH,EQ,C'000010YY'),
               PUSH=(81:20,4,CH)),  // 提取'000010YY'后的4位年份到扩展字段
        IFTHEN=(WHEN=GROUP,
               BEGIN=(12,8,CH,EQ,C'000010YY'),
               PUSH=(85:ID=4))      // 给每组分配唯一ID,保留组内原始顺序
  SORT FIELDS=(81,4,CH,D,85,4,ZD,A) // 先按年份降序,再按组ID升序保证组内顺序
  OUTREC BUILD=(1,80)
/*

代码解释

  1. INREC阶段:
    • 第一个WHEN=GROUP:定位到组起始记录(匹配000010YY),将其后的4位年份(位置20-23)推到扩展位置81-84
    • 第二个WHEN=GROUP:给每个记录组分配唯一4位ID到扩展位置85-88,确保组内记录的原始顺序被锁定
  2. SORT阶段:
    • 优先按81-84位置的年份字符串降序排序,实现组的年份排序需求
    • 再按85-88位置的组ID升序排序,保证同一组内的记录保持原有顺序
  3. OUTREC阶段:去除扩展字段,输出原始的80字节记录

内容的提问来源于stack exchange,提问作者MaMu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:30:58