我在数据库表中有一个NOTE 如何计算该字符串的长度?
我有一个像
这样的变量10 NOTE.
49 NOTE-LEN PIC S9(4) USAGE COMP.
49 NOTE-TEXT PIC X(500).
注意是一个500个字符的字符串。 我想计算音符长度。
答案 0 :(得分:8)
这是一种常见的方式:
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
当然,这需要将NOTE-TEXT-BYTE
定义为NOTE-TEXT
的成分。
49级可能很重要,所以不能这么干净:
49 NOTE-TEXT PIC X(500).
49 NOTE-TEXT-BYTE
REDEFINES NOTE-TEXT
OCCURS 500 PIC X.
也许49s提供了一些参考修改的案例。也许不是。
答案 1 :(得分:2)
使用GNU Cobol
FUNCTION LENGTH(FUNCTION TRIM(note-text TRAILING))
需要注意的是,在COBOL 2014发布之前,零长度项目的定义不明确。 FUNCTION TRIM将始终为所有空间字段返回至少一个空格。由于标准中已经定义了零长度项目,因此在不太遥远的未来可能会发生变化。
答案 2 :(得分:0)
这是我的最爱:
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
答案 3 :(得分:-1)
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
注意:
不需要LENGTH OF (NOTE-TEXT) -> For LENGTH OF
函数()。