Archives par mot-clé : UNSTRING

8.7 L’INSTRUCTION UNSTRING

Le but de cette instruction (UNSTRING) est d’éclater une variable DISPLAY en plusieurs morceaux. La règle d’éclatement est donnée par DELIMITED BY.

Format :

Les mêmes règles que pour le STRING sont d’application. ALL est destiné à éliminer les redondances d’un caractère délimiteur. Par exemple ALL “AB” signifie que AB ou même ABABAB sont délimiteurs.

NOM-DE-POINTEUR , numérique DISPLAY, que le programmeur doit initialiser à 0 permet de compter le nombre de caractères examinés dans la zone nom-de-donnée-1.

NOM-DE-COMPTEUR, numérique DISPLAY, compte le nombre de zones réceptrices créées.

OVERFLOW, arrête le déroulement de l’instruction si le contenu du pointeur est négatif ou > à la taille de la zone nom-de-donnée-1, ou lorsque la zone nom-de-donnée-1 n’est pas entièrement examinée mais que l’instruction UNSTRING ne dispose plus de zones réceptrices i,j,…

Si un OVERFLOW est déclenché sans que l’option ne soit spécifiée, l’instruction UNSTRING est arrêtée et le programme passe à l’instruction suivante.

Les zones nom-de-donnée-i etc. sont les zones réceptrices.

DELIMITER IN spécifie la variable dans laquelle on désire transférer le délimiteur qui a été utilisé pour cet éclatement.

COUNT IN indique le nombre de caractères transférés par cet éclatement.

Exemple :
01 ZONE PIC X(12).
01 NOM PIC X(5).
01 AN PIC XXXX.
UNSTRING ZONE DELIMITED BY SPACE INTO NOM AN.
Si ZONE = "ANNEE 1999 "

alors le résultat est NOM = “ANNEE” et AN = “1999”.

UNSTRING A delimited by ‘.’ or ‘/’ ….

Exemple – UNSTRING

Programme utilisant le UNSTRING :

IDENTIFICATION DIVISION.
PROGRAM-ID.  UNSTRING.
AUTHOR.      LA COMMUNAUTE DU COBOL.

ENVIRONMENT DIVISION.                                            
CONFIGURATION SECTION.                                           
SPECIAL-NAMES.                                                   
    DECIMAL-POINT IS COMMA. 

DATA DIVISION.
WORKING-STORAGE SECTION.

01  WS-AUXILIARES.
    05  CHAMP-1             PIC X(006)       VALUE SPACES. 
    05  CHAMP-2             PIC X(006)       VALUE SPACES. 
    05  CHAMP-3             PIC X(006)       VALUE SPACES. 
    05  CHAMP-4             PIC X(006)       VALUE SPACES. 
    05  CHAMP-123           PIC X(016)       VALUE SPACES.
    05  CHAMP-ABC           PIC X(011)       VALUE SPACES.
    05  CHAMP-XYZ           PIC X(013)       VALUE SPACES.
    05  COMPTEUR-01         PIC 9(006)       VALUE ZEROES. 
    05  COMPTEUR-1          PIC 9(006)       VALUE ZEROES. 
    05  COMPTEUR-2          PIC 9(006)       VALUE ZEROES. 
    05  COMPTEUR-3          PIC 9(006)       VALUE ZEROES. 
    05  COMPTEUR-4          PIC 9(006)       VALUE ZEROES. 
    05  DELIMITEUR-1        PIC X(001)       VALUE SPACES. 
    05  DELIMITEUR-2        PIC X(001)       VALUE SPACES. 
    05  POINTEUR-1          PIC 9(006)       VALUE 1. 
    05  WS-NOM-01           PIC X(020)       VALUE SPACES.
    05  WS-NOM-02           PIC X(020)       VALUE SPACES.
    05  WS-NOM-03           PIC X(020)       VALUE SPACES.
    05  WS-NOM-04           PIC X(020)       VALUE SPACES.

PROCEDURE DIVISION.

001-INIT.

    MOVE "AB*CDJKL*MNS*TUV" TO CHAMP-123
    UNSTRING CHAMP-123
             DELIMITED BY "*" 
        INTO CHAMP-1 CHAMP-2 CHAMP-3 CHAMP-4
    END-UNSTRING 
    DISPLAY "CHAMP-1: " CHAMP-1 
    DISPLAY "CHAMP-2: " CHAMP-2 
    DISPLAY "CHAMP-3: " CHAMP-3 
    DISPLAY "CHAMP-4: " CHAMP-4 

* Resultado do teste:
* CHAMP-1: AB    
* CHAMP-2: CDJKL 
* CHAMP-3: MNS   
* CHAMP-4: TUV   


    MOVE "AB*CDJKL*MNS*TUV" TO CHAMP-123
    UNSTRING CHAMP-123 
             DELIMITED BY "*" 
        INTO CHAMP-1 COUNT IN COMPTEUR-1 
             CHAMP-2 COUNT IN COMPTEUR-2 
             CHAMP-3 COUNT IN COMPTEUR-3 
             CHAMP-4 COUNT IN COMPTEUR-4
    END-UNSTRING
    DISPLAY "CHAMP-1: " CHAMP-1 "   COMPTEUR-1: " COMPTEUR-1 
    DISPLAY "CHAMP-2: " CHAMP-2 "   COMPTEUR-2: " COMPTEUR-2 
    DISPLAY "CHAMP-3: " CHAMP-3 "   COMPTEUR-3: " COMPTEUR-3 
    DISPLAY "CHAMP-4: " CHAMP-4 "   COMPTEUR-4: " COMPTEUR-4 

* Resultado do teste:
* CHAMP-1: AB       COMPTEUR-1: 000002
* CHAMP-2: CDJKL    COMPTEUR-2: 000005
* CHAMP-3: MNS      COMPTEUR-3: 000003
* CHAMP-4: TUV      COMPTEUR-4: 000003


    MOVE "AB*CDJKL*MNS*TUV" TO CHAMP-123
    UNSTRING CHAMP-123 
             DELIMITED BY "*" 
        INTO CHAMP-1 COUNT IN COMPTEUR-1 
             CHAMP-2 COUNT IN COMPTEUR-2 
             CHAMP-3 COUNT IN COMPTEUR-3 
             CHAMP-4 COUNT IN COMPTEUR-4 
        WITH POINTER POINTEUR-1 
        TALLYING IN COMPTEUR-01
    END-UNSTRING
    DISPLAY "CHAMP-1    : " CHAMP-1 "   COMPTEUR-1: " COMPTEUR-1 
    DISPLAY "CHAMP-2    : " CHAMP-2 "   COMPTEUR-2: " COMPTEUR-2 
    DISPLAY "CHAMP-3    : " CHAMP-3 "   COMPTEUR-3: " COMPTEUR-3 
    DISPLAY "CHAMP-4    : " CHAMP-4 "   COMPTEUR-4: " COMPTEUR-4 
    DISPLAY "POINTEUR-1 : " POINTEUR-1 
    DISPLAY "COMPTEUR-01: " COMPTEUR-01 

* Resultado do teste:
* CHAMP-1    : AB       COMPTEUR-1: 000002
* CHAMP-2    : CDJKL    COMPTEUR-2: 000005
* CHAMP-3    : MNS      COMPTEUR-3: 000003
* CHAMP-4    : TUV      COMPTEUR-4: 000003
* PONTEIRO-1 : 000017
* COMPTEUR-01: 000004

    MOVE "XYZ/ABC*DEF" TO CHAMP-ABC
    UNSTRING CHAMP-ABC
             DELIMITED BY "/" OR "*"
        INTO CHAMP-1 DELIMITER IN DELIMITEUR-1
             CHAMP-2 DELIMITER IN DELIMITEUR-2
    END-UNSTRING
    DISPLAY "CHAMP-1    : " CHAMP-1 "   DELIMITEUR-1: " DELIMITEUR-1 
    DISPLAY "CHAMP-2    : " CHAMP-2 "   DELIMITEUR-2: " DELIMITEUR-2 

* Resultado do teste:
* CHAMP-1    : XYZ      DELIMITEUR-1: /
* CHAMP-2    : ABC      DELIMITEUR-2: *

    UNSTRING CHAMP-ABC 
             DELIMITED BY "/" OR "*" 
        INTO CHAMP-1 
             DELIMITER IN DELIMITEUR-1
    END-UNSTRING
    DISPLAY "CHAMP-1    : " CHAMP-1 "   DELIMITEUR-1: " DELIMITEUR-1 

* Resultado do teste:
* CHAMP-1    : XYZ      DELIMITEUR-1: /

    MOVE "JKLMN****STUV" TO CHAMP-XYZ 
    UNSTRING CHAMP-XYZ
             DELIMITED BY ALL "*" 
        INTO CHAMP-1 CHAMP-2
    END-UNSTRING
    DISPLAY "CHAMP-1: " CHAMP-1 
    DISPLAY "CHAMP-2: " CHAMP-2 

* Resultado do teste:
* CHAMP-1: JKLMN 
* CHAMP-2: STUV  

    STOP RUN.

Exemple – UNSTRING UPPER-CASE/LOWER-CASE

Voici un programme avec UNSTRING UPPER-CASE/LOWER-CASE :

 IDENTIFICATION DIVISION.
PROGRAM-ID. UNSTRING.
AUTHOR. LA COMMUNAUTE DU COBOL.
*----------------------------------------------------------
DATA DIVISION.
WORKING-STORAGE SECTION.

01 WS-AUXILIARES.
05 WS-NOM-COMPLET PIC X(30) VALUE "LA COMMUNAUTE DU COBOL".
05 WS-PREMIER PIC X(02).
05 WS-DEUXIEME PIC X(10).
05 WS-TROISIEME PIC X(02).

PROCEDURE DIVISION.
************************************
******** UNSTRING Normal *********
************************************
UNSTRING
WS-NOM-COMPLET DELIMITED BY SPACE
INTO WS-PREMIER WS-DEUXIEME WS-TROISIEME
END-UNSTRING

DISPLAY "UNSTRING Normal"
DISPLAY " "
DISPLAY "Premier = " WS-PREMIER.
DISPLAY "Deuxième = " WS-DEUXIEME.
DISPLAY "Troisième = " WS-TROISIEME.
DISPLAY " "

***********************************************
* UNSTRING combinant avec FUNCTION UPPER-CASE *
***********************************************
UNSTRING
FUNCTION UPPER-CASE (WS-NOM-COMPLET) DELIMITED BY SPACE
INTO WS-PREMIER WS-DEUXIEME WS-TROISIEME
END-UNSTRING

DISPLAY "UNSTRING combinant avec FUNCTION UPPER-CASE"
DISPLAY " "
DISPLAY "Premier = " WS-PREMIER.
DISPLAY "Deuxième = " WS-DEUXIEME.
DISPLAY "Troisième = " WS-TROISIEME.
DISPLAY " "

***********************************************
* UNSTRING combinant avec FUNCTION LOWER-CASE *
***********************************************
UNSTRING
FUNCTION LOWER-CASE (WS-NOM-COMPLET) DELIMITED BY SPACE
INTO WS-PREMIER WS-DEUXIEME WS-TROISIEME
END-UNSTRING

DISPLAY "UNSTRING combinant avec FUNCTION LOWER-CASE"
DISPLAY " "
DISPLAY "Premier = " WS-PREMIER.
DISPLAY "Deuxième = " WS-DEUXIEME.
DISPLAY "Troisième = " WS-TROISIEME.
DISPLAY " "

STOP RUN.

RESULTAT

UNSTRING Normal

Premier   = La
Deuxième  = Communaute
Troisième = Du

UNSTRING combinant la FUNCTION UPPER-CASE

Premier   = LA
Deuxième  = COMMUNAUTE
Troisième = DU

UNSTRING combinant la FUNCTION LOWER-CASE

Premier   = la
Deuxième  = communaute
Troisième = du