IBM大型机论坛索引
 
登录
 
IBM大型机论坛索引 大型机:搜索 IBM Mainframe论坛:常见问题解答 寄存器
 

将VB文件转换为FB加上特殊格式


IBM大型机论坛 -> 同步排序
发表新话题   回复主题
查看上一个主题 :: 查看下一个主题  
作者 信息
cz016m

新的用户


已加入:2016年3月9日
帖子:7
所在地:美国

发布发表于:周五十月19,2018 7:26下午
引用回复

您好,

我一直在将可变长度,制表符分隔文件从(VB 512)转换为固定块(FB 80)的工作已经进行了几天,但取得的成功有限。除其他事项外,我一直在努力进行日期转换,而且我无法在Syncsort手册或在线中找到许多我想做的事的示例,而时间至关重要。

到目前为止,这是我写的:
码:

  OPTION SKIPREC=1                                             
       OMIT COND=(1,1,CH,EQ,X'05')                             
     INREC PARSE=(%01=(ENDBEFR = X'05',FIXLEN = 08),
                  %02 =(ENDBEFR = X'05',FIXLEN = 05),
                  %03 =(ENDBEFR = X'05',FIXLEN = 09),
                  %04 =(STARTAFT = X'7F',ENDBEFR = X'7F',FIXLEN = 30),
                  %05 =(ENDBEFR = X'05',FIXLEN = 01),
                  %06 =(ENDBEFR = C'-',FIXLEN = 03),
                  %07 =(ENDBEFR = C'-',FIXLEN = 02),
                  %08=(ENDBEFR = X'05',FIXLEN = 04),
                  %09=(ENDBEFR = X'05',FIXLEN = 01),
                  %10=(ENDBEFR = X'05',FIXLEN = 01)),
           BUILD=(001,004,
                  %06,
                  %07,
                  %08,
                  %04,
                  %03,
                  %02,
                  %01,
                  %09,
                  %10,
                  C'C')                                       
     SORT FIELDS=COPY                                         


我想一步一步做到这一点。我需要跳过输入文件中的第一条记录,因为它包含不需要的标题。这些字段由十六进制制表符(X'05')分隔。输入文件的某些行中有我要处理的数据,但其他行中的前31个字节的十六进制制表符(X'05')在输出中不希望出现。

日期必须从格式16-APR-18转换为20180416。

必须从名称中删除双引号和逗号,姓氏和名字之间必须有空格,并且姓氏和名字的总和不得超过30个字节,如果有空格,请在右侧填充空格,或者在右侧将其截断(如果有)名称超过30个字节。

必须从9位数字中删除破折号。

字母“ C”必须紧接记录中的最后一个有效值之后。它应该在输出记录的位置63中。记录末尾(位置64至80)的其余17个字节应用空格填充。

以下是包含10条记录的输入文件。最后五个记录似乎包含空格,但实际上在前31个字节中包含十六进制“ 05”(Tab)。在每个输入记录的有效数据的最后一个字节之后,有25个十六进制制表符(X'05'),并且512 VB记录的其余部分用空格填充。
码:

field_1 field_2 field_3 field_4 field_5 field_6 field_7     
CPG75145 4275-18-2018年4月16日"DOE, JOHN" 123-45-6789 E A       
CPG75147 3495-18年5月20日"DOE, JANE" 234-56-7891 E A     
CPG75148 1010-18年6月21日"JAMES, LEBRON" 345-67-8912 E A         
CPG75150 3500 18年7月21日"IRVING, KYRIE" 456-78-9123 E A
CPG75152 4860 18年8月16日"MAYFIELD, BAKER" 567-89-1234 O R   







记录不需要按任何特定顺序排序。输出文件应如下所示:
码:

123456789DOE JOHN                     2018041604275CPG75145ERC
234567891DOE JANE                     2018052003495CPG75147ERC
345678912詹姆斯·勒布朗                 2018062101010CPG75148ERC
456789123IRVING KYRIE                 2018072103500CPG75150ERC
567891234MAYFIELD BAKER               2018081604860CPG75152ORC


输出记录布局:
位置01-09:固定长度,9个字节
位置10-39:固定长度,30字节,左对齐,并在右侧填充空格
位置40-47:固定长度,8个字节,YYYYMMDD
位置48-52:固定长度,5个字节,右对齐并在左侧填充零
位置53-60:固定长度,8个字节
位置61-61:固定长度,1个字节
位置62-62:固定长度,1个字节
位置63-80:固定长度,18个字节,值“ C”

我没有经常使用Syncsort。重新格式化此文件的任何帮助将不胜感激。

感谢您的时间。
回到顶部
查看用户资料 发送私信
阿伦·拉吉(Arun Raj)

主持人


已加入:2006年10月17日
帖子:2481
位置:@我的办公桌

发布发表:周五十月19,2018 7:51下午
引用回复

cz016m,

欢迎来到论坛。在您的第一篇文章中,所有细节都做得不错。

引用:
位置62-62:固定长度,1个字节
这是您预期输出中的错字吗,除了最后一个记录以外,是否应该全部为A?
回到顶部
查看用户资料 发送私信
cz016m

新的用户


已加入:2016年3月9日
帖子:7
所在地:美国

发布发表:周五十月19,2018 8:47下午
引用回复

您好,

是的,有一个错字。位置62应为固定长度,为1个字节,并取输入文件中的所有内容。可以是“ A”或“ R”。

这是输出的样子(已更正):
码:

123456789DOE JOHN                     2018041604275CPG75145EAC
234567891DOE JANE                     2018052003495CPG75147EAC
345678912詹姆斯·勒布朗                 2018062101010CPG75148EAC
456789123IRVING KYRIE                 2018072103500CPG75150EAC
567891234MAYFIELD BAKER               2018081604860CPG75152ORC


感谢您的答复。
回到顶部
查看用户资料 发送私信
阿伦·拉吉(Arun Raj)

主持人


已加入:2006年10月17日
帖子:2481
位置:@我的办公桌

发布发表:星期五十月19,2018 10:44下午
引用回复

cz016m,

由于输入为VB,因此您可能需要在pos-5而不是pos-1上进行检查。
码:
忽略COND =(1,1,CH,EQ,X'05')
回到顶部
查看用户资料 发送私信
cz016m

新的用户


已加入:2016年3月9日
帖子:7
所在地:美国

发布发表:星期五十月19,2018 10:55下午
引用回复

我也看到了,并应用了修复程序。

谢谢!
回到顶部
查看用户资料 发送私信
阿伦·拉吉(Arun Raj)

主持人


已加入:2006年10月17日
帖子:2481
位置:@我的办公桌

发布发表于:星期五十月19,2018 11:28下午
引用回复

cz016m,

我没有Syncsort,因此无法测试,但这应该可以帮助您入门。祝好运。

还要注意,我已经将世纪硬编码为20,您可以将其更改为使用适当的Syncsort日期函数来进行实际的日期转换(使用CENTWIN parm确定世纪窗口,同时将2位数的年转换为4位数的年) 。

码:
// SYSIN    DD *                                                   
  OPTION SKIPREC=1                                                 
  忽略COND =(5,1,CH,EQ,X'05')                                     
  INREC PARSE =(%01=(ENDBEFR = X'05',FIXLEN = 08),                     
               %02=(ENDBEFR = X'05',FIXLEN = 05),                     
               %03=(ENDBEFR = X'05',FIXLEN = 09),                     
               %04=(STARTAFT = X'7F',ENDBEFR = X'7F',FIXLEN = 30),       
                 %=(ENDBEFR = X'05',FIXLEN = 01),                     
               %05=(ENDBEFR = X'05',FIXLEN = 11),                     
               %06=(ENDBEFR = X'05',FIXLEN = 01),                     
               %07=(ENDBEFR = X'05',FIXLEN = 01)),                     
        建造=(001,004,                                           
               %05,UFF,ZD,LENGTH=9,                               
               30X,                                               
               08X,                                               
               %02,UFF,ZD,LENGTH=5,                               
               %01,                                               
               %06,                                               
               %07,                                               
               C'C',                                                   
               %03,                                                   
               %04)                                                   
  排序字段=复制                                                     
  OUTREC IFTHEN =(WHEN=INIT,OVERLAY=(71:71,3,                           
  CHANGE=(3,C'Jan',C'01',C'Feb',C'02',C'Mar',C'03',C'Apr',C'04',       
           C'May',C'05',C'Jun',C'06',C'Jul',C'07',C'Aug',C'08',       
           C'Sep',C'09',C'Oct',C'10',C'Nov',C'11',C'Dec',C'12'),     
  NOMATCH=(71,3))),                                                   
         IFTHEN=(WHEN=INIT,FINDREP=(IN = C',',OUT = C'',STARTPOS = 77)),     
         IFTHEN=(WHEN=INIT,OVERLAY=(14:77,30,44:C'20',75,2,71,2,68,2))
  OUTFIL VTOF,BUILD=(5,63,80:X)
回到顶部
查看用户资料 发送私信
cz016m

新的用户


已加入:2016年3月9日
帖子:7
所在地:美国

发布发表:星期六十月20,2018 12:52上午
引用回复

它在INREC语句上引发语法错误,但我会解决。

它不喜欢“ 30X”这一行。

谢谢!
回到顶部
查看用户资料 发送私信
阿伦·拉吉(Arun Raj)

主持人


已加入:2006年10月17日
帖子:2481
位置:@我的办公桌

发布发表:星期六十月20,2018 2:33上午
引用回复

您可以从SYSOUT发布完整的错误消息吗?
回到顶部
查看用户资料 发送私信
谢尔盖肯

活跃的成员


已加入:2008年4月29日
帖子:939
所在地:马里兰

发布发表于:星期日十月21,2018 1:12上午
引用回复

需要添加重要的修补程序以使代码更加健壮:处理人员姓名字段时更加灵活,并且无论输入数据中是否包含逗号,都不要更改最终字段的大小。

需要ABSPOS = 5来忽略可能的X'05'作为RDW的一部分。

码:
* OPTION SKIPREC = 1                                                       
   OMIT COND=(5,1,CH,EQ,X'05')                                           
   INREC PARSE=(%01=(ABSPOS = 5,ENDBEFR = X'05',FIXLEN = 08),                           
                %02 =(ENDBEFR = X'05',FIXLEN = 05),                           
                %03 =(ENDBEFR = X'05',FIXLEN = 09),                           
                %04 =(STARTAFT=C'"',ENDBEFR=C'"',FIXLEN=30),           
                  %=(ENDBEFR=X'05'),  (不需要跳过字段的长度)                           
                %05 =(ENDBEFR = X'05',FIXLEN = 11),                           
                %06 =(ENDBEFR = X'05',FIXLEN = 01),                           
                %07 =(ENDBEFR = X'05',FIXLEN = 01)),                         
         BUILD=(1,4,                 RDW                                                   
               %05,UFF,ZD,LENGTH = 9,压缩的电话号码             
                %04,SQZ=(SHIFT = LEFT,LENGTH = 30,PREBLANK = C',',MID = C''),   
*                   <-提供长度稳定的可选逗号->     
                C'20',               fixed century (unflexible...)       
                %03,                 date as C'dd-mon-yy'               
               %02,UFF,ZD,LENGTH = 5,五位数代码                   
                %01,                 long code                           
                %06,%07,             two code characters                 
                C'C',                final constant 'C'                 
                20X)                 填充,以满足OUTFIL           
   SORT FIELDS=COPY                                                     
   OUTREC FINDREP=(INOUT=(C'-Jan-',C'01',                               
                          C'-Feb-',C'02',                               
                          C'-Mar-',C'03',                               
                          C'-Apr-',C'04',                 
                          C'-May-',C'05',                 
                          C'-Jun-',C'06',                 
                          C'-Jul-',C'07',                 
                          C'-Aug-',C'08',                 
                          C'-Sep-',C'09',                 
                          C'-Oct-',C'10',                 
                          C'-Nov-',C'11',                 
                          C'-Dec-',C'12'))               
  OUTFIL VTOF,                                           
         BUILD=(5,41,             initial part           
               50,2,48,2,46,2,    exchange DD <-> YY     
               52,33)             final part             
 END                                                     


码:
**************************************数据顶部************** *******************
123456789DOE JOHN                     2018041604275CPG75145EAC               
234567891DOE JANE                     2018052003495CPG75147EAC               
345678912詹姆斯·勒布朗                 2018062101010CPG75148EAC               
456789123IRVING KYRIE                 2018072103500CPG75150EAC               
567891234MAYFIELD BAKER               2018081604860CPG75152ORC               
********************************数据底部*************** ****************
回到顶部
查看用户资料 发送私信
阿伦·拉吉(Arun Raj)

主持人


已加入:2006年10月17日
帖子:2481
位置:@我的办公桌

发布发表于:星期日十月21,2018 7:52上午
引用回复

谢尔盖肯-您可能需要修改处理以名字或姓氏(尽管未在OP样本数据中显示)中嵌入空格的方法。
回到顶部
查看用户资料 发送私信
cz016m

新的用户


已加入:2016年3月9日
帖子:7
所在地:美国

发布发表于:十月21,2018 4:10下午
引用回复

是的,即使我没有在示例输入数据中显示它们,名称字段中也可能存在中间的首字母或多个值。

更新的输入:
码:

field_1 field_2 field_3 field_4 field_5 field_6 field_7     
CPG75145 4275-18-2018年4月16日"DOE, JOHN" 123-45-6789 E A       
CPG75147 3495-18年5月20日"DOE, JANE" 234-56-7891 E A     
CPG75148 1010-18年6月21日"JAMES JR, LEBRON R" 345-67-8912 E A         
CPG75150 3500 18年7月21日"IRVING, KYRIE" 456-78-9123 E A
CPG75152 4860 18年8月16日"MAYFIELD, BAKER" 567-89-1234 O R   


更新的输出:
码:

123456789DOE JOHN                     2018041604275CPG75145ERC
234567891DOE JANE                     2018052003495CPG75147ERC
345678912JAMES JR LEBRON R             2018062101010CPG75148ERC
456789123IRVING KYRIE                 2018072103500CPG75150ERC
567891234MAYFIELD BAKER               2018081604860CPG75152ORC


非常感谢您的帮助!
回到顶部
查看用户资料 发送私信
谢尔盖肯

活跃的成员


已加入:2008年4月29日
帖子:939
所在地:马里兰

发布发表于:星期日十月21,2018 5:33下午
引用回复

阿伦·拉吉(Arun Raj)写道:
谢尔盖肯-您可能需要修改处理以名字或姓氏(尽管未在OP样本数据中显示)中嵌入空格的方法。

我在创建代码时总是会进行此类修改 为了我自己的工作
在这里,我只是想提出如何以适当方式处理此问题的想法。任何人都可以随意添加自己的修改,以满足自己的工作要求。
该论坛不应完全完成分配给其他人的任务。
回到顶部
查看用户资料 发送私信
阿伦·拉吉(Arun Raj)

主持人


已加入:2006年10月17日
帖子:2481
位置:@我的办公桌

发布发表于:十月22,2018 10:30上午
引用回复

cz016m写道:
是的,即使我没有在示例输入数据中显示它们,名称字段中也可能存在中间的首字母或多个值。
cz016m,

我之前发布的解决方案可以解决这种情况。
如果您遇到语法问题,请发布完整的错误消息。有人可以帮助您。
回到顶部
查看用户资料 发送私信
谢尔盖肯

活跃的成员


已加入:2008年4月29日
帖子:939
所在地:马里兰

发布发表于:星期一十月22,2018 5:50下午
引用回复

阿伦·拉吉(Arun Raj)写道:
谢尔盖肯-您可能需要修改处理以名字或姓氏(尽管未在OP样本数据中显示)中嵌入空格的方法。

无需任何修改;用我的方法可以正常处理这种情况。
回到顶部
查看用户资料 发送私信
cz016m

新的用户


已加入:2016年3月9日
帖子:7
所在地:美国

发布发表于:星期一十月22,2018 6:20下午
引用回复

您好,

我想说谢谢,阿伦·拉杰(Arun Raj)&sergeyken,寻求帮助。名称中总会有一个逗号,因此sergeyken的解决方案即使在中间有缩写的情况下也能完美工作。

非常感谢你!
回到顶部
查看用户资料 发送私信
阿伦·拉吉(Arun Raj)

主持人


已加入:2006年10月17日
帖子:2481
位置:@我的办公桌

发布发表于:星期一十月22,2018 6:52下午
引用回复

引用:
无需任何修改;用我的方法可以正常处理这种情况。
我的错。我想念您的控制语句中有MID。谢谢!

cz016m-很高兴听到它为您工作。我没有Syncsort,但是DFSORT和DFSORT解决方案为我提供了两个示例输入的预期输出。
回到顶部
查看用户资料 发送私信
查看上一个主题 :: :: 查看下一个主题  
发表新话题   回复主题 查看书签
所有时间均为格林尼治标准时间+ 6小时
论坛索引 -> 同步排序

 


类似主题
话题 论坛 回覆
该主题已锁定:您无法编辑帖子或回复。 将匹配的记录写入输出文件 DFSORT / ICETOOL 11
没有新帖 比较文件记录计数百分比... DFSORT / ICETOOL 4
没有新帖 比较两个文件以查找位置/日期... 同步排序 2
没有新帖 将文件从PD转换为显示... 同步排序 4
没有新帖 RECFM = U磁带文件的记录数 DFSORT / ICETOOL 17
搜索我们的论坛:


回到顶部