我在数据库表中有一个注释如何计算该字符串的长度?
我有一个变量定义如
10 NOTE.
49 NOTE-LEN PIC S9(4) USAGE COMP.
49 NOTE-TEXT PIC X(500).
注意是一个500个字符的字符串。我想计算音符长度。
这是一种常见的方式:
MOVE ZERO TO count-of-trailing-spaces
INSPECT FUNCTION REVERSE ( NOTE-TEXT )
TALLYING count-of-trailing-spaces
FOR LEADING SPACE
SUBTRACT count-of-trailing-spaces
FROM LENGTH OF ( NOTE-TEXT )
GIVING NOTE-LEN
FUNCTION REVERSE
将字段的字节交换为逆序。 INSPECT
没有TALLYING ... TRAILING
(除了某些供应商的编译器,但它是非标准的)所以INSPECT ... LEADING ...
可以在字段颠倒后使用。
有时候我应该把我的讽刺帽子拿走。如果使用FUNCTION REVERSE
,也首先检查字段的空间,没有任何意义可以反转500个空格,然后计算500个前导空格。
还“知道你的数据”。如果笔记大多是短的,并且你做了很多笔记,你可能想要调查是否需要更快速的东西。这取决于你的数据和硬件是否有从中受益,但要记住它。
值得研究的是,线上的某些东西是否真的知道这个领域有多长,并且已经可以告诉你了。
我只是从后面循环,计算空格(首先检查所有空间后)。减少对CPU的压力。一种方法:
IF NOTE-TEXT EQUAL TO SPACE
MOVE ZERO TO NOTE-LEN
ELSE
MOVE LENGTH OF NOTE-TEXT TO NOTE-LEN
PERFORM
UNTIL NOTE-TEXT-BYTE ( NOTE-LEN )
NOT EQUAL TO SPACE
SUBTRACT +1 FROM NOTE-LEN
END-PERFORM
END-IF
当然,这需要将qazxsw poi定义为qazxsw poi的组成部分。
49级可能很重要,所以不能这么干净:
NOTE-TEXT-BYTE
也许49s提供了一些参考修改的案例。也许不是。
使用GNU Cobol
NOTE-TEXT
需要注意的是,在2014年COBOL发布之前,零长度项目的定义不明确。 FUNCTION TRIM将始终为所有空间字段返回至少一个空格。由于标准中已经定义了零长度项目,因此在不太遥远的未来可能会发生变化。
这是我最喜欢的:
49 NOTE-TEXT PIC X(500).
49 NOTE-TEXT-BYTE
REDEFINES NOTE-TEXT
OCCURS 500 PIC X.
FUNCTION LENGTH(FUNCTION TRIM(note-text TRAILING))
注意:不需要If Note-Text > Spaces
Perform Varying Note-Len from Length of Note-Text by -1
Until Note-Text (Note-Len: 1) > Space
End-Perform
Else
Move Zero to Note-Len
End-If
函数()。