2

我正在寻找 Visual Basic 的 MID 函数的 COBOL 替代方案。我需要做的是从 8 个字符串中取出前 5 个字母并将它们连接起来。

我正在使用富士通 COBOL。

非常感谢,

伊万

4

4 回答 4

5

Paxdiablo 提供了几种有效的方法来做到这一点。另一种方法是在STRING动词之外使用引用修饰。完整的程序示例如下:

   IDENTIFICATION DIVISION.                                      
   PROGRAM-ID. EXAMPLE9.                                         
   DATA DIVISION.                                                
   WORKING-STORAGE SECTION.                                      
   01  STRINGS.                                                  
       05 STRING1    PIC X(10) VALUE 'AAAAAAAAAA'.               
       05 STRING2    PIC X(10) VALUE 'BBBBBBBBBB'.               
       05 STRING3    PIC X(10) VALUE 'CCCCCCCCCC'.               
       05 STRING4    PIC X(10) VALUE 'DDDDDDDDDD'.               
       05 STRING5    PIC X(10) VALUE 'EEEEEEEEEE'.               
       05 STRING6    PIC X(10) VALUE 'FFFFFFFFFF'.               
       05 STRING7    PIC X(10) VALUE 'GGGGGGGGGG'.               
       05 STRING8    PIC X(10) VALUE 'HHHHHHHHHH'.               
       05 STRING-OUT PIC X(40) VALUE SPACES.                     
   PROCEDURE DIVISION.

       STRING STRING1(1:5) STRING2(1:5) STRING3(1:5) STRING4(1:5)
              STRING5(1:5) STRING6(1:5) STRING7(1:5) STRING8(1:5) 
              DELIMITED BY SIZE                                   
         INTO STRING-OUT

       DISPLAY STRING-OUT                                         
       GOBACK.                                                    

这大大减少了冗长,并在单个语句中捕获了连接。最好的建议是阅读STRING动词。有许多创新的方法可以使用它。

COBOL 不提供与 BASIC MID 语句的精确模拟。STRING您可以通过使用、UNSTRINGINSPECT引用修改的某种组合来完成类似的操作。参考修改的一个示例是:SOME-VARIABLE-NAME(1:5)- 1:5 位指定SOME-VARIABLE-NAME从第一个字符开始长度为 5 个字符的子字符串。修饰符本身可能是数值变量。和动词提供了许多非常强大的功能STRINGUNSTRING

但总的来说,COBOL 在字符串操作方面并不是特别擅长(有些人可能会说它在任何事情上都不是特别擅长 - 但我不同意这种说法)。

于 2010-07-21T13:34:36.607 回答
2

我认为它是这样的:

WORKING STORAGE SECTION.
    01  NORMAL-STRING-A    PIC X(80)
    01  NORMAL-STRING-B    PIC X(80)
    01  NORMAL-STRING-C    PIC X(80)
    01  NORMAL-STRING-D    PIC X(80)
    01  NORMAL-STRING-E    PIC X(80)
    01  SUB-STRING.
        05  FIVE           PIC X(5)
        05  REST           PIC X(75)
    01  TWENTY-FIVE-A.
        05  FIVE-A         PIC X(5).
        05  FIVE-B         PIC X(5).
        05  FIVE-C         PIC X(5).
        05  FIVE-D         PIC X(5).
        05  FIVE-E         PIC X(5).
    01  TWENTY-FIVE-B      PIC X(25).

PROCEDURE DIVISION.
    MOVE NORMAL-STRING-A TO SUB-STRING.
    MOVE FIVE TO FIVE-A.

    MOVE NORMAL-STRING-B TO SUB-STRING.
    MOVE FIVE TO FIVE-B.

    MOVE NORMAL-STRING-C TO SUB-STRING.
    MOVE FIVE TO FIVE-C.

    MOVE NORMAL-STRING-D TO SUB-STRING.
    MOVE FIVE TO FIVE-D.

    MOVE NORMAL-STRING-E TO SUB-STRING.
    MOVE FIVE TO FIVE-E.

    MOVE TWENTY-FIVE-A TO TWENTY-FIVE-B.

然后,您的字符串在TWENTY-FIVE-B.

你知道,我无法想象为什么人们认为 COBOL 很冗长 :-)


更严肃地说,我认为你可以按照这些思路做一些事情来获得相同的结果(你可能不得不摆弄 start 和 length 参数,我已经有一段时间没有做任何严肃的 COBOL 了):

WORKING STORAGE SECTION.
    01  STRING-A           PIC X(80)
    01  STRING-B           PIC X(80)
    01  STRING-C           PIC X(80)
    01  STRING-D           PIC X(80)
    01  STRING-E           PIC X(80)
    01  TWENTY-FIVE        PIC X(25).

PROCEDURE DIVISION.
    MOVE STRING-A(1:5) TO TWENTY-FIVE( 1:5).
    MOVE STRING-B(1:5) TO TWENTY-FIVE( 6:5).
    MOVE STRING-C(1:5) TO TWENTY-FIVE(11:5).
    MOVE STRING-D(1:5) TO TWENTY-FIVE(16:5).
    MOVE STRING-E(1:5) TO TWENTY-FIVE(21:5).
于 2010-07-21T12:39:14.997 回答
0

子字符串示例页面显示了一些变体。一个例子:

*   Task3 suffix(xStr,Length)
*   Extract the last Length number of chars from a string
*   Solution - use reference modification with start of substring
*   defined as the FullStringLength - SubStringLength + 1
*   In this example we get the last 13 characters.
MOVE 13 TO StrLength
DISPLAY "Task3 = " xStr2((StrSize - StrLength) + 1:StrLength)
于 2010-07-21T13:03:59.523 回答
0
WORKING STORAGE SECTION.
01  NORMAL-STRING-A    PIC X(80)
01  NORMAL-STRING-B    PIC X(80)
01  NORMAL-STRING-C    PIC X(80)
01  NORMAL-STRING-D    PIC X(80)
01  NORMAL-STRING-E    PIC X(80)
01  TWENTY-FIVE-A.
    05  FIVE-A         PIC X(5).
    05  FIVE-B         PIC X(5).
    05  FIVE-C         PIC X(5).
    05  FIVE-D         PIC X(5).
    05  FIVE-E         PIC X(5).
01  TWENTY-FIVE-B REDEFINES TWENTY-FIVE-A PIC X(25).

PROCEDURE DIVISION.
    MOVE NORMAL-STRING-A TO FIVE-A
    MOVE NORMAL-STRING-B TO FIVE-B
    MOVE NORMAL-STRING-C TO FIVE-C
    MOVE NORMAL-STRING-D TO FIVE-D
    MOVE NORMAL-STRING-E TO FIVE-E
于 2013-01-21T20:14:58.583 回答