Programmeren in COBOL/Bewerkingen/Werken met tekst
In dit hoofdstuk worden de verschillende manieren uitgelegd om te werken met tekst.
ALPHABETIC
bewerkenVia ALPHABETIC kun je controleren of de inhoud van een veld alleen maar hoofdletters, kleine letters en spaties bevat. Je kunt dit in een programma als beveiliging inbouwen, zodat de gebruiker geen verkeerde informatie geeft. Als je bijvoorbeeld een naam vraagt, kun je controleren dat het geen getal is of rare tekens bevat.
COBOL-code: ALPHABETIC
IDENTIFICATION DIVISION. PROGRAM-ID. Tekst. DATA DIVISION. WORKING-STORAGE SECTION. 77 naam PIC X(10). PROCEDURE DIVISION. HOOFD. ACCEPT naam NO BEEP IF naam ALPHABETIC THEN DISPLAY "Naam is toegestaan" ELSE DISPLAY "Naam is niet toegestaan" END-IF STOP RUN.
Naast ALPHABETIC bestaat er ook nog ALPHABETIC-LOWER en ALPHABETIC-UPPER. ALPHABETIC-LOWER controleert of alles in kleine letters staat en UPPER controleert of alles in hoofdletters staat.
Tekens vervangen
bewerkenTekens vervangen gaat via het INSPECT-statement maar er zijn twee manieren om dat statement te gebruiken. Via REPLACING en CONVERTING, zowel bij numerieke als bij alfanumerieke velden.
REPLACING
bewerkenREPLACING maakt het mogelijk om in een veld een teken te veranderen door een ander teken of een stukje tekst door een ander stukje tekst.
COBOL-code: Tekst vervangen
IDENTIFICATION DIVISION. PROGRAM-ID. Tekst vervangen. DATA DIVISION. WORKING-STORAGE SECTION. 77 tekst PIC xxxx VALUE "papa". PROCEDURE DIVISION. HOOFD. DISPLAY tekst INSPECT tekst REPLACING ALL "p" BY "m". DISPLAY tekst INSPECT tekst REPLACING ALL "ma" BY "do". DISPLAY tekst STOP RUN.
papa mama dodo
ALL betekent in dit geval dat alle p’s worden vervangen door m’s. Naast ALL, kan je ook FIRST en LEADING gebruiken. FIRST betekent dat alleen de eerste vervangen wordt, en LEADING vervangt alleen als het helemaal vooraan staat. Je kunt slechts één veld tegelijkertijd gebruiken. Wat je vervangt en waarmee je het vervangt, moeten een gelijke tekenlengte hebben. 2 tekens moeten altijd vervangen worden door 2 tekens. Ook is het mogelijk om andere velden en constanten te gebruiken, zoals REPLACING ALL tekst BY andertekst of REPLACING ALL ZERO BY quote.
CONVERTING
bewerkenEen stuk tekst omzetten naar allemaal hoofdletters, kan met op verschillende manieren. Het kan omslachtig met REPLACING: REPLACING ALL "a" by "A", REPLACING ALL "b" by "B" enzovoort. Efficiënter gaat het met het INSPECT-statement in combinatie met CONVERTING.
COBOL-code: Tekst vervangen
IDENTIFICATION DIVISION. PROGRAM-ID. Tekst vervangen. DATA DIVISION. WORKING-STORAGE SECTION. 77 tekst PIC xxxx VALUE "test". 77 kleineletters PIC X(27) VALUE "abcdefghijklmnopqrstuvwxyz". 77 hoofdletters PIC X(27) VALUE "ABCDEFGHIJKLMNOPQRSTUVWXYZ". PROCEDURE DIVISION. HOOFD. DISPLAY tekst INSPECT tekst CONVERTING kleineletters TO hoofdletters DISPLAY tekst STOP RUN.
test TEST
Wanneer je CONVERTING gebruikt, kijkt COBOL eerst naar het veld dat je wilt omzetten. Hij kijkt naar het eerst teken, in dit geval de letter t, en zoekt die vervolgens in het veld kleineletters. Als COBOL de letter heeft gevonden, onthoudt die de positie van die letter, in dit geval positie 20. Dan kijkt het naar hoofdletters en zoekt wat er op positie 20 staat, dus hoofdletter T. Dit proces wordt herhaald tot alle letters vervangen werden. Voor de rest gelden dezelfde regels als bij REPLACING.
Dit algoritme kan gebruikt worden om een tekst op eenvoudige manier te versleutelen met een geheime code.
COBOL-code: Caesarcijfer-rotatie3
IDENTIFICATION DIVISION. PROGRAM-ID. Tekst vervangen. DATA DIVISION. WORKING-STORAGE SECTION. 77 tekst PIC X(29) VALUE "D I T I S Z E E R G E H E I M". 77 gewone-tekst PIC X(27) VALUE "ABCDEFGHIJKLMNOPQRSTUVWXYZ". 77 caesar-rotatie3 PIC X(27) VALUE "XYZABCDEFGHIJKLMNOPQRSTUVW". PROCEDURE DIVISION. HOOFD. DISPLAY tekst INSPECT tekst CONVERTING gewone-tekst TO caesar-rotatie3 DISPLAY tekst STOP RUN.
D I T I S Z E E R G E H E I M A F Q F P W B B O D B E B F J
Tekst opslitsen met UNSTRING
bewerken- Zie ook UNSTRING voor meer informatie.
Via UNSTRING kun je een alfanumeriek veld met tekst opsplitsen in kleinere velden.
COBOL-code: UNSTRING
IDENTIFICATION DIVISION. PROGRAM-ID. tekstopslitsen. DATA DIVISION. WORKING-STORAGE SECTION. 77 datum PIC x(8). 77 dag PIC XX. 77 maand PIC XX. 77 jaar PIC XXXX. PROCEDURE DIVISION. hoofd. DISPLAY "Geef een datum(ddmmjjjj)." ACCEPT datum NO BEEP UNSTRING datum INTO dag, maand, jaar DISPLAY "Dag: " dag " Maand: " maand " Jaar: " jaar STOP RUN.
Dit programma leest een datum in volgens ddmmjjjj, wat betekent dat een datum als 21 april 2007 moet worden geschreven als 21042007. Uiteindelijk wordt de datum verdeeld over de velden dag, maand en jaar. Na UNSTRING moet het veld komen dat je wilt opsplitsen. Na INTO moeten dan de velden komen waar de opgesplitste tekst moet komen. Het aantal velden mag minder of meer zijn dan het aantal stukjes tekst dat ontstaat door de UNSTRING.
Geef een datum(ddmmjjjj). 21042007 Dag: 21 Maand: 04 Jaar: 2007
Mensen schrijven hun datums niet zoals 21042007 maar eerder als 21-04-2007. UNSTRING maakt het mogelijk om een tekst op te splitsen op basis van een bepaald teken in dit geval moet dat "-" zijn. Dit gebeurd als volgt.
COBOL-code: UNSTRING
UNSTRING datum DELIMITED BY "-" INTO dag, maand, jaar
DELIMITED geeft dus aan op basis van welk teken de tekst moet worden opgesplitst.