2010-07-21 13 views
2

Je cherche l'alternative COBOL de la fonction MID de Visual Basic. La chose que je dois faire est de prendre de 8 chaînes les 5 premières lettres et de les concaténer. J'utilise Fujitsu COBOL.COBOL alternative au MID de BASIC et comment concaténer des cordes?

Un grand merci,

Yvan

+1

Regardez la syntaxe ici sous-chaîne: http://stackoverflow.com/questions/46863/concatenating-unknown-length-strings-in-cobol – gimel

Répondre

5

Paxdiablo a donné quelques moyens valables de le faire. Une autre façon serait d'utiliser la modification de référence en plus du verbe STRING. Exemple complet du programme suit:

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.              

Cela réduit la verbosité un peu et capture la concaténation dans une seule instruction. Le meilleur conseil est de lire sur le verbe STRING. Il y a un certain nombre de façons novatrices de l'utiliser. COBOL ne fournit pas un analogue exact à l'instruction BASIC MID. Vous pouvez effectuer des opérations similaires en utilisant une combinaison de STRING, UNSTRING, INSPECT et de modification de référence. Un exemple d'une modification de référence est: SOME-VARIABLE-NAME(1:5) - le bit 1: 5 spécifie une sous-chaîne de SOME-VARIABLE-NAME en commençant par le premier caractère sur une longueur de 5 caractères. Les modificateurs peuvent eux-mêmes être des variables numériques. Les verbes STRING et UNSTRING fournissent un certain nombre de fonctionnalités qui peuvent être assez puissantes. En général, COBOL n'est pas particulièrement bon en manipulation de chaîne (certains pourraient dire qu'il n'est pas particulièrement bon à quoi que ce soit - mais je ne suis pas d'accord avec cette affirmation).

+0

Merci beaucoup, THSiS résolu mon problème :) – friedkiwi

2

je pense qu'il ressemble à ceci:

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. 

Ensuite, votre chaîne est en TWENTY-FIVE-B.

Vous savez, je ne peux pas imaginer pourquoi les gens pensaient COBOL était :-) bavard


Sur une note plus sérieuse, je pense que vous pouvez faire quelque chose le long de ces lignes pour obtenir le même résultat (vous peut avoir à jouer avec le début et les paramètres de longueur, il a été un moment que je l'ai fait tout COBOL grave):

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

Cette page substring examples montre quelques variations. Un exemple:

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