用cobol计算变量的长度字符串

时间:2014-07-16 09:39:07

标签: cobol

我在数据库表中有一个NOTE 如何计算该字符串的长度?

我有一个像

这样的变量
10 NOTE.
    49 NOTE-LEN          PIC S9(4) USAGE COMP.
    49 NOTE-TEXT         PIC X(500).

注意是一个500个字符的字符串。 我想计算音符长度。

4 个答案:

答案 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函数()。