代码之家  ›  专栏  ›  技术社区  ›  user3401335

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

  •  2
  • user3401335  · 技术社区  · 10 年前

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

    我有一个定义如下的变量

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

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

    4 回复  |  直到 10 年前
        1
  •  9
  •   Simon Sobisch    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 ... 可以在字段反转后使用。

    有时我应该摘掉我的讽刺帽子 功能反转 ,也请先检查字段中的空格,反转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. 
    

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

        2
  •  3
  •   Brian Tiffin    10 年前

    使用GNU Cobol

    FUNCTION LENGTH(FUNCTION TRIM(note-text TRAILING))
    

    需要注意的是,在COBOL 2014发布之前,零长度项的定义是错误的。FUNCTION TRIM将始终为全空间字段返回至少一个空格。由于标准中已经定义了零长度项目,这一点在不久的将来可能会发生变化。

        3
  •  1
  •   PeterPanda    10 年前

    这是我最喜欢的:

    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
    
        4
  •  -2
  •   SirPeople    6 年前
    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 函数()不是必需的。