Cobol альтернатива MID BASIC и как объединить строки? - PullRequest
2 голосов
/ 21 июля 2010

Я ищу альтернативу COBOL функции MID в Visual Basic. Что мне нужно сделать, это взять из 8 строк первые 5 букв и объединить их.

Я использую Fujitsu COBOL.

Большое спасибо,

Yvan

Ответы [ 4 ]

5 голосов
/ 21 июля 2010

Паксдиабло дал несколько правильных способов сделать это. Другой способ - использовать модификацию ссылки в дополнение к глаголу 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, UNSTRING, INSPECT и модификацию ссылки. Пример эталонной модификации: SOME-VARIABLE-NAME(1:5) - бит 1: 5 указывает подстроку SOME-VARIABLE-NAME, начиная с первого символа длиной 5 символов. Модификаторы сами могут быть числовыми переменными. Глаголы STRING и UNSTRING предоставляют ряд мощных функций.

В общем, COBOL не особенно хорош в манипулировании строками (некоторые могут сказать, что он не особенно хорош во всем - но я бы не согласился с этим утверждением).

2 голосов
/ 21 июля 2010

Я думаю, что это выглядит примерно так:

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).
0 голосов
/ 22 января 2013
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
0 голосов
/ 21 июля 2010

Эта страница примеров подстрок показывает несколько вариантов.Пример:

*   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)
...