查看上一个主题 :: 查看下一个主题
|
作者 |
信息 |
cz016m
新的用户

已加入:2016年3月9日 帖子:7 所在地:美国
|
|
|
|
您好,
我一直在将可变长度,制表符分隔文件从(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 位置:@我的办公桌
|
|
|
|
cz016m,
欢迎来到论坛。在您的第一篇文章中,所有细节都做得不错。
这是您预期输出中的错字吗,除了最后一个记录以外,是否应该全部为A? |
|
回到顶部 |
|
 |
cz016m
新的用户

已加入:2016年3月9日 帖子:7 所在地:美国
|
|
|
|
您好,
是的,有一个错字。位置62应为固定长度,为1个字节,并取输入文件中的所有内容。可以是“ A”或“ R”。
这是输出的样子(已更正):
码: |
123456789DOE JOHN 2018041604275CPG75145EAC
234567891DOE JANE 2018052003495CPG75147EAC
345678912詹姆斯·勒布朗 2018062101010CPG75148EAC
456789123IRVING KYRIE 2018072103500CPG75150EAC
567891234MAYFIELD BAKER 2018081604860CPG75152ORC
|
感谢您的答复。 |
|
回到顶部 |
|
 |
阿伦·拉吉(Arun Raj)
主持人
已加入:2006年10月17日 帖子:2481 位置:@我的办公桌
|
|
|
|
cz016m,
由于输入为VB,因此您可能需要在pos-5而不是pos-1上进行检查。
码: |
忽略COND =(1,1,CH,EQ,X'05') |
|
|
回到顶部 |
|
 |
cz016m
新的用户

已加入:2016年3月9日 帖子:7 所在地:美国
|
|
|
|
我也看到了,并应用了修复程序。
谢谢! |
|
回到顶部 |
|
 |
阿伦·拉吉(Arun Raj)
主持人
已加入:2006年10月17日 帖子:2481 位置:@我的办公桌
|
|
|
|
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 所在地:美国
|
|
|
|
它在INREC语句上引发语法错误,但我会解决。
它不喜欢“ 30X”这一行。
谢谢! |
|
回到顶部 |
|
 |
阿伦·拉吉(Arun Raj)
主持人
已加入:2006年10月17日 帖子:2481 位置:@我的办公桌
|
|
|
|
您可以从SYSOUT发布完整的错误消息吗? |
|
回到顶部 |
|
 |
谢尔盖肯
活跃的成员

已加入:2008年4月29日 帖子:939 所在地:马里兰
|
|
|
|
需要添加重要的修补程序以使代码更加健壮:处理人员姓名字段时更加灵活,并且无论输入数据中是否包含逗号,都不要更改最终字段的大小。
需要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 位置:@我的办公桌
|
|
|
|
谢尔盖肯-您可能需要修改处理以名字或姓氏(尽管未在OP样本数据中显示)中嵌入空格的方法。 |
|
回到顶部 |
|
 |
cz016m
新的用户

已加入:2016年3月9日 帖子:7 所在地:美国
|
|
|
|
是的,即使我没有在示例输入数据中显示它们,名称字段中也可能存在中间的首字母或多个值。
更新的输入:
码: |
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 所在地:马里兰
|
|
|
|
阿伦·拉吉(Arun Raj)写道: |
谢尔盖肯-您可能需要修改处理以名字或姓氏(尽管未在OP样本数据中显示)中嵌入空格的方法。 |
我在创建代码时总是会进行此类修改 为了我自己的工作
在这里,我只是想提出如何以适当方式处理此问题的想法。任何人都可以随意添加自己的修改,以满足自己的工作要求。
该论坛不应完全完成分配给其他人的任务。 |
|
回到顶部 |
|
 |
阿伦·拉吉(Arun Raj)
主持人
已加入:2006年10月17日 帖子:2481 位置:@我的办公桌
|
|
|
|
cz016m写道: |
是的,即使我没有在示例输入数据中显示它们,名称字段中也可能存在中间的首字母或多个值。 |
cz016m,
我之前发布的解决方案可以解决这种情况。
如果您遇到语法问题,请发布完整的错误消息。有人可以帮助您。 |
|
回到顶部 |
|
 |
谢尔盖肯
活跃的成员

已加入:2008年4月29日 帖子:939 所在地:马里兰
|
|
|
|
阿伦·拉吉(Arun Raj)写道: |
谢尔盖肯-您可能需要修改处理以名字或姓氏(尽管未在OP样本数据中显示)中嵌入空格的方法。 |
无需任何修改;用我的方法可以正常处理这种情况。 |
|
回到顶部 |
|
 |
cz016m
新的用户

已加入:2016年3月9日 帖子:7 所在地:美国
|
|
|
|
您好,
我想说谢谢,阿伦·拉杰(Arun Raj)&sergeyken,寻求帮助。名称中总会有一个逗号,因此sergeyken的解决方案即使在中间有缩写的情况下也能完美工作。
非常感谢你! |
|
回到顶部 |
|
 |
阿伦·拉吉(Arun Raj)
主持人
已加入:2006年10月17日 帖子:2481 位置:@我的办公桌
|
|
|
|
引用: |
无需任何修改;用我的方法可以正常处理这种情况。 |
我的错。我想念您的控制语句中有MID。谢谢!
cz016m-很高兴听到它为您工作。我没有Syncsort,但是DFSORT和DFSORT解决方案为我提供了两个示例输入的预期输出。 |
|
回到顶部 |
|
 |
|
 |
查看书签
所有时间均为格林尼治标准时间+ 6小时 |
|