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

问题描述 投票:2回答:4

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

我有一个变量定义如

10 NOTE.
    49 NOTE-LEN          PIC S9(4) USAGE COMP.
    49 NOTE-TEXT         PIC X(500).

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

cobol
4个回答
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

当然,这需要将qazxsw poi定义为qazxsw poi的组成部分。

49级可能很重要,所以不能这么干净:

NOTE-TEXT-BYTE

也许49s提供了一些参考修改的案例。也许不是。


2
投票

使用GNU Cobol

NOTE-TEXT

需要注意的是,在2014年COBOL发布之前,零长度项目的定义不明确。 FUNCTION TRIM将始终为所有空间字段返回至少一个空格。由于标准中已经定义了零长度项目,因此在不太遥远的未来可能会发生变化。


0
投票

这是我最喜欢的:

49  NOTE-TEXT         PIC X(500).
49  NOTE-TEXT-BYTE
      REDEFINES NOTE-TEXT
      OCCURS 500      PIC X. 

-1
投票
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 函数()。

© www.soinside.com 2019 - 2024. All rights reserved.