我在数据库表中有一个注释如何计算该字符串的长度?
我有一个变量定义如
10 NOTE.
49 NOTE-LEN PIC S9(4) USAGE COMP.
49 NOTE-TEXT PIC X(500).
Run Code Online (Sandbox Code Playgroud)
注意是一个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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
当然,这需要NOTE-TEXT-BYTE作为其组成部分的定义NOTE-TEXT.
49级可能很重要,所以不能这么干净:
49 NOTE-TEXT PIC X(500).
49 NOTE-TEXT-BYTE
REDEFINES NOTE-TEXT
OCCURS 500 PIC X.
Run Code Online (Sandbox Code Playgroud)
也许49s提供了一些参考修改的案例.也许不是.