Cobol 从第一个、中间首字母和最后一个设置名称格式
记录具有以下格式的名称:Cobol 从第一个、中间首字母和最后一个设置名称格式,cobol,Cobol,记录具有以下格式的名称: 01 LAST-NAME PIC X(18). 01 FIRST-NAME PIC X(12). 01 MI-NAME PIC X(01). 姓氏和名字当然可以是任意大小的 我需要将名称字段放在一个单独的工作存储字段中(没有尾随空格,但每个名称之间有一个空格),长度为42个空格: 01 WS-FULL-NAME PIC X(42) 例如: LAST-NAME = Smithington FIRST-NAME = Edward MI-NA
01 LAST-NAME PIC X(18).
01 FIRST-NAME PIC X(12).
01 MI-NAME PIC X(01).
姓氏和名字当然可以是任意大小的
我需要将名称字段放在一个单独的工作存储字段中(没有尾随空格,但每个名称之间有一个空格),长度为42个空格:
01 WS-FULL-NAME PIC X(42)
例如:
LAST-NAME = Smithington
FIRST-NAME = Edward
MI-NAME = H
预期结果:
Edward H Smithington
如果中间的首字母为空,我当然不包括它,期望的结果是:
Edward Smithington
我有一个例程来确定每个名称字段的实际长度,该字段已经处理了尾随空格(*我不需要担心前导空格)(见下文):
“移动姓氏(1:W-SUB)到?????”是我被“卡住”的地方
i、 e.如何将三个名称字段“串”在一起以产生所需的结果=Edward H Smithington(*包括F,MI+L之间的空格)。要求您使用
字符串执行此操作。反对使用字符串作为名称的理由是名称可以有嵌入的空格DE LA HAYE
例如,作为姓氏,“圣约翰”(发音为sinjun)作为名字。也可能有输入错误,给出前导空格和嵌入空格。您似乎知道您没有前导空格,但真正或错误的嵌入空格会使字符串的简单使用变得更加棘手
如果您可以保证没有前导空格或嵌入空格(绝对保证),那么
如果需要将空格移到全名,则在前一个名称之前,如果当前名称比前一个名称短,则最后将使用前一个名称的一部分
如果不能保证缺少前导空格和嵌入空格,则必须对名字和姓氏使用reference-modified字段(每个字段有一个长度),并使用按大小分隔的字段。那有什么意义呢
01 W-FULL-NAME.
05 W-FIRST-NAME.
10 FILLER OCCURS 0 TO 12 TIMES
DEPENDING ON length-of-first-name.
15 FILLER PIC X.
05 SPACE-AFTER-FIRST-NAME PIC X.
05 W-MI-NAME.
10 FILLER OCCURS 0 TO 2 TIMES
DEPENDING ON length-for-mi.
15 FILLER PIC X.
05 W-LAST-NAME.
10 FILLER OCCURS 0 TO 18 TIMES
DEPENDING ON length-of-last-name.
15 FILLER PIC X.
您需要执行两次操作来获取名字和姓氏的长度(如前所述)。如果WS-mi-NAME是空格,则将mi的长度改为零,否则将其改为2
然后:
W-FULL-NAME是一个长度可变的字段,它以所需的格式包含所需的数据,然后您可以对其执行任何操作
通过将“复杂性”转移到数据划分中并定义数据,过程划分中的代码变得非常简单
尝试一下,要查看格式化数据,请执行以下操作:
DISPLAY
">"
W-FULL-NAME
"<"
第一次移动到输出将把名字复制到全名。两者都不需要修改引用,其效果是,除了名称的字符之外,目标字段的其余部分将为空
存在的字符数是已知的,因此可以通过添加一个字符来计算目标字段中数据的下一个可用位置
第二次移动取决于是否有任何中间初始数据,如果有,则移动到上面计算的下一个可用输出位置。移动的字节数(一个)在目标中受到限制
第三次移动与第二次移动类似,只是无条件移动,并且移动字节的限制是可变的
上述的变化是可能的。有一种更简洁的方法,但在某种程度上取决于编译器。你用的是哪一种
您可以简化尾随空白数量的计算:
01 W-SUB COMP PIC 9(4).
PROCESS-LAST-NAME.
MOVE ZERO TO W-SUB
IF LAST-NAME NOT EQUAL TO SPACE
MOVE FUNCTION LENGTH ( LAST-NAME )
TO W-SUB
PERFORM
UNTIL LAST-NAME ( W-SUB : 1 )
NOT EQUAL TO SPACE
SUBTRACT 1 FROM W-SUB
END-PERFORM
END-IF
这样,您就不必具有双重终止条件。我会重新定义字段,并使用订阅而不是引用修改。我还需要重命名W-SUB,以表明它包含数据的长度。谢谢BilI-我被要求使用字符串命令来执行此操作,但这对我来说很好。。。几天前刚开始工作。已经15年没有用Cobol写过了。老实说,这是一个常规的大型机,我不知道编译器的哪个版本,因为我还没有被允许编译任何东西(:),并且一直在进行定向。但我会在周一找到答案。使用IDM也可以解决所有问题。预计起飞时间
MOVE SPACE TO SPACE-AFTER-FIRST-NAME
MOVE FIRST-NAME TO W-FIRST-NAME
MOVE LAST-NAME TO W-LAST-NAME
MOVE MI-NAME TO W-MI-NAME
DISPLAY
">"
W-FULL-NAME
"<"
><
do your PERFORM to count the first-name trailing spaces
MOVE FIRST-NAME TO WS-FULL-NAME
ADD 1 WS-SUB
GIVING next-available-output
IF MI-NAME NOT EQUAL TO SPACE
MOVE MI-NAME TO WS-FULL-NAME
( next-available-output : 1 )
ADD 2 TO next-available-output
END-IF
do your PERFORM for the last-name
MOVE LAST-NAME TO WS-FULL-NAME
( next-available-output : W-SUB )
01 W-SUB COMP PIC 9(4).
PROCESS-LAST-NAME.
MOVE ZERO TO W-SUB
IF LAST-NAME NOT EQUAL TO SPACE
MOVE FUNCTION LENGTH ( LAST-NAME )
TO W-SUB
PERFORM
UNTIL LAST-NAME ( W-SUB : 1 )
NOT EQUAL TO SPACE
SUBTRACT 1 FROM W-SUB
END-PERFORM
END-IF