The POSITION concept in COBOL represents comprehensive data positioning and sophisticated location tracking capabilities within enterprise programming environments, providing advanced string positioning mechanisms for precise data placement, enhanced character location features for text processing operations, and intelligent position management capabilities that enable accurate data positioning, optimal string parsing workflows, and systematic location tracking while maintaining position accuracy, ensuring efficient text processing, and enabling flexible positioning architectures across business applications requiring exact data placement, character-level processing, and reliable position management throughout sophisticated text parsing and data extraction scenarios.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283*> POSITION usage in string operations WORKING-STORAGE SECTION. 01 WS-STRING-OPERATIONS. 05 WS-SOURCE-STRING PIC X(100) VALUE "JOHN,DOE,MANAGER,75000,CHICAGO,IL,60601". 05 WS-PARSED-DATA. 10 WS-FIRST-NAME PIC X(20). 10 WS-LAST-NAME PIC X(20). 10 WS-TITLE PIC X(20). 10 WS-SALARY PIC X(10). 10 WS-CITY PIC X(20). 10 WS-STATE PIC X(5). 10 WS-ZIP-CODE PIC X(10). 05 WS-POSITION-DATA. 10 WS-NAME-POSITION PIC 9(3). 10 WS-TITLE-POSITION PIC 9(3). 10 WS-SALARY-POSITION PIC 9(3). 10 WS-CITY-POSITION PIC 9(3). 10 WS-STATE-POSITION PIC 9(3). 10 WS-ZIP-POSITION PIC 9(3). 01 WS-STRING-POINTER PIC 9(3) VALUE 1. 01 WS-CURRENT-POSITION PIC 9(3). PROCEDURE DIVISION. DEMONSTRATE-STRING-POSITIONING. DISPLAY "=== STRING POSITIONING OPERATIONS ===" *> Parse string with position tracking UNSTRING WS-SOURCE-STRING DELIMITED BY "," INTO WS-FIRST-NAME DELIMITER IN WS-DELIMITER-1 POSITION IN WS-NAME-POSITION WS-LAST-NAME DELIMITER IN WS-DELIMITER-2 POSITION IN WS-TITLE-POSITION WS-TITLE DELIMITER IN WS-DELIMITER-3 POSITION IN WS-SALARY-POSITION WS-SALARY DELIMITER IN WS-DELIMITER-4 POSITION IN WS-CITY-POSITION WS-CITY DELIMITER IN WS-DELIMITER-5 POSITION IN WS-STATE-POSITION WS-STATE DELIMITER IN WS-DELIMITER-6 POSITION IN WS-ZIP-POSITION WS-ZIP-CODE WITH POINTER WS-STRING-POINTER END-UNSTRING *> Display parsed data with positions DISPLAY "Parsed Data with Positions:" DISPLAY "First Name: " WS-FIRST-NAME " (Position: " WS-NAME-POSITION ")" DISPLAY "Last Name: " WS-LAST-NAME " (Position: " WS-TITLE-POSITION ")" DISPLAY "Title: " WS-TITLE " (Position: " WS-SALARY-POSITION ")" DISPLAY "Salary: " WS-SALARY " (Position: " WS-CITY-POSITION ")" DISPLAY "City: " WS-CITY " (Position: " WS-STATE-POSITION ")" DISPLAY "State: " WS-STATE " (Position: " WS-ZIP-POSITION ")" DISPLAY "ZIP: " WS-ZIP-CODE *> Advanced position tracking TRACK-FIELD-POSITIONS. 01 WS-RECORD-LAYOUT. 05 WS-FIELD-POSITIONS OCCURS 10 TIMES. 10 WS-FIELD-NAME PIC X(15). 10 WS-START-POS PIC 9(3). 10 WS-END-POS PIC 9(3). 10 WS-FIELD-LENGTH PIC 9(3). MOVE "FIRST_NAME" TO WS-FIELD-NAME(1) MOVE WS-NAME-POSITION TO WS-START-POS(1) COMPUTE WS-END-POS(1) = WS-TITLE-POSITION - 1 COMPUTE WS-FIELD-LENGTH(1) = WS-END-POS(1) - WS-START-POS(1) + 1 MOVE "LAST_NAME" TO WS-FIELD-NAME(2) MOVE WS-TITLE-POSITION TO WS-START-POS(2) COMPUTE WS-END-POS(2) = WS-SALARY-POSITION - 1 COMPUTE WS-FIELD-LENGTH(2) = WS-END-POS(2) - WS-START-POS(2) + 1 DISPLAY "Field Layout Analysis:" PERFORM VARYING FIELD-INDEX FROM 1 BY 1 UNTIL FIELD-INDEX > 2 DISPLAY "Field: " WS-FIELD-NAME(FIELD-INDEX) DISPLAY " Start: " WS-START-POS(FIELD-INDEX) DISPLAY " End: " WS-END-POS(FIELD-INDEX) DISPLAY " Length: " WS-FIELD-LENGTH(FIELD-INDEX) END-PERFORM
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156*> Advanced position operations for data processing 01 WS-XML-PROCESSING. 05 WS-XML-STRING PIC X(500) VALUE "
". 05 WS-TAG-POSITIONS OCCURS 10 TIMES. 10 WS-TAG-NAME PIC X(20). 10 WS-START-TAG-POS PIC 9(3). 10 WS-END-TAG-POS PIC 9(3). 10 WS-CONTENT-START PIC 9(3). 10 WS-CONTENT-END PIC 9(3). 05 WS-EXTRACTED-VALUES. 10 WS-CUSTOMER-ID PIC X(10). 10 WS-CUSTOMER-NAME PIC X(30). 10 WS-CUSTOMER-BALANCE PIC X(15). 01 WS-CSV-PROCESSING. 05 WS-CSV-RECORD PIC X(200) VALUE '"Product A","Electronics","$299.99","In Stock","Warehouse A"'. 05 WS-QUOTE-POSITIONS OCCURS 20 TIMES. 10 WS-QUOTE-START PIC 9(3). 10 WS-QUOTE-END PIC 9(3). 05 WS-CSV-FIELDS. 10 WS-PRODUCT-NAME PIC X(30). 10 WS-CATEGORY PIC X(20). 10 WS-PRICE PIC X(15). 10 WS-STATUS PIC X(15). 10 WS-LOCATION PIC X(20). PROCEDURE DIVISION. PROCESS-XML-POSITIONS. DISPLAY "=== XML POSITION PROCESSING ===" *> Find and extract XML tag positions MOVE 1 TO WS-SEARCH-POSITION MOVE 1 TO WS-TAG-COUNT *> Find customer ID PERFORM FIND-XML-TAG-POSITION USING " 12345 John Doe 1500.75 " " " "ID" 1 *> Find customer name PERFORM FIND-XML-TAG-POSITION USING "" " " "NAME" 2 *> Find customer balance PERFORM FIND-XML-TAG-POSITION USING "" " " "BALANCE" 3 *> Extract values based on positions PERFORM EXTRACT-XML-VALUES DISPLAY "Extracted XML Data:" DISPLAY " ID: " WS-CUSTOMER-ID DISPLAY " Name: " WS-CUSTOMER-NAME DISPLAY " Balance: " WS-CUSTOMER-BALANCE FIND-XML-TAG-POSITION. USING START-TAG END-TAG TAG-NAME TAG-INDEX. *> Find start tag position INSPECT WS-XML-STRING(WS-SEARCH-POSITION:) TALLYING WS-CHAR-COUNT FOR CHARACTERS BEFORE INITIAL START-TAG COMPUTE WS-START-TAG-POS(TAG-INDEX) = WS-SEARCH-POSITION + WS-CHAR-COUNT *> Calculate content start position COMPUTE WS-CONTENT-START(TAG-INDEX) = WS-START-TAG-POS(TAG-INDEX) + FUNCTION LENGTH(START-TAG) *> Find end tag position INSPECT WS-XML-STRING(WS-CONTENT-START(TAG-INDEX):) TALLYING WS-CHAR-COUNT FOR CHARACTERS BEFORE INITIAL END-TAG COMPUTE WS-CONTENT-END(TAG-INDEX) = WS-CONTENT-START(TAG-INDEX) + WS-CHAR-COUNT - 1 MOVE TAG-NAME TO WS-TAG-NAME(TAG-INDEX) DISPLAY "Tag: " TAG-NAME DISPLAY " Content Position: " WS-CONTENT-START(TAG-INDEX) " to " WS-CONTENT-END(TAG-INDEX) EXTRACT-XML-VALUES. *> Extract customer ID COMPUTE WS-EXTRACT-LENGTH = WS-CONTENT-END(1) - WS-CONTENT-START(1) + 1 MOVE WS-XML-STRING(WS-CONTENT-START(1):WS-EXTRACT-LENGTH) TO WS-CUSTOMER-ID *> Extract customer name COMPUTE WS-EXTRACT-LENGTH = WS-CONTENT-END(2) - WS-CONTENT-START(2) + 1 MOVE WS-XML-STRING(WS-CONTENT-START(2):WS-EXTRACT-LENGTH) TO WS-CUSTOMER-NAME *> Extract customer balance COMPUTE WS-EXTRACT-LENGTH = WS-CONTENT-END(3) - WS-CONTENT-START(3) + 1 MOVE WS-XML-STRING(WS-CONTENT-START(3):WS-EXTRACT-LENGTH) TO WS-CUSTOMER-BALANCE PROCESS-CSV-POSITIONS. DISPLAY " " DISPLAY "=== CSV POSITION PROCESSING ===" *> Find quoted field positions MOVE 1 TO WS-SEARCH-POSITION MOVE 0 TO WS-QUOTE-COUNT PERFORM VARYING CHAR-INDEX FROM 1 BY 1 UNTIL CHAR-INDEX > FUNCTION LENGTH(WS-CSV-RECORD) IF WS-CSV-RECORD(CHAR-INDEX:1) = '"' ADD 1 TO WS-QUOTE-COUNT IF WS-QUOTE-COUNT IS ODD MOVE CHAR-INDEX TO WS-QUOTE-START((WS-QUOTE-COUNT + 1) / 2) ELSE MOVE CHAR-INDEX TO WS-QUOTE-END(WS-QUOTE-COUNT / 2) END-IF END-IF END-PERFORM *> Extract CSV fields based on quote positions PERFORM EXTRACT-CSV-FIELDS DISPLAY "Extracted CSV Data:" DISPLAY " Product: " WS-PRODUCT-NAME DISPLAY " Category: " WS-CATEGORY DISPLAY " Price: " WS-PRICE DISPLAY " Status: " WS-STATUS DISPLAY " Location: " WS-LOCATION EXTRACT-CSV-FIELDS. *> Extract each quoted field PERFORM VARYING FIELD-INDEX FROM 1 BY 1 UNTIL FIELD-INDEX > 5 COMPUTE WS-FIELD-START = WS-QUOTE-START(FIELD-INDEX) + 1 COMPUTE WS-FIELD-LENGTH = WS-QUOTE-END(FIELD-INDEX) - WS-QUOTE-START(FIELD-INDEX) - 1 EVALUATE FIELD-INDEX WHEN 1 MOVE WS-CSV-RECORD(WS-FIELD-START:WS-FIELD-LENGTH) TO WS-PRODUCT-NAME WHEN 2 MOVE WS-CSV-RECORD(WS-FIELD-START:WS-FIELD-LENGTH) TO WS-CATEGORY WHEN 3 MOVE WS-CSV-RECORD(WS-FIELD-START:WS-FIELD-LENGTH) TO WS-PRICE WHEN 4 MOVE WS-CSV-RECORD(WS-FIELD-START:WS-FIELD-LENGTH) TO WS-STATUS WHEN 5 MOVE WS-CSV-RECORD(WS-FIELD-START:WS-FIELD-LENGTH) TO WS-LOCATION END-EVALUATE END-PERFORM
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960IDENTIFICATION DIVISION. PROGRAM-ID. POSITION-DEMO. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-POSITION-CONTROL. 05 WS-PROCESSING-COUNT PIC 9(4) VALUE 0. 05 WS-POSITION-ERRORS PIC 9(3) VALUE 0. 05 WS-EXTRACTION-COUNT PIC 9(4) VALUE 0. 01 WS-LOG-PROCESSING. 05 WS-LOG-RECORD PIC X(300) VALUE "2023-12-25 14:30:45 [INFO] User john.doe logged in from IP 192.168.1.100". 05 WS-LOG-COMPONENTS. 10 WS-LOG-DATE PIC X(10). 10 WS-LOG-TIME PIC X(8). 10 WS-LOG-LEVEL PIC X(10). 10 WS-LOG-MESSAGE PIC X(100). 10 WS-LOG-IP PIC X(15). PROCEDURE DIVISION. MAIN-POSITION-DEMO. DISPLAY "=== COMPREHENSIVE POSITION DEMO ===" PERFORM PARSE-LOG-ENTRIES PERFORM VALIDATE-POSITION-DATA PERFORM DISPLAY-EXTRACTION-RESULTS DISPLAY "=== POSITION DEMO COMPLETE ===" STOP RUN. PARSE-LOG-ENTRIES. DISPLAY "Parsing log entries with position tracking..." *> Parse log components using position-aware extraction UNSTRING WS-LOG-RECORD DELIMITED BY " " INTO WS-LOG-DATE WS-LOG-TIME WS-LOG-LEVEL DELIMITER IN WS-DELIMITER WS-LOG-MESSAGE COUNT IN WS-FIELD-COUNT END-UNSTRING ADD 1 TO WS-PROCESSING-COUNT ADD 1 TO WS-EXTRACTION-COUNT DISPLAY "✅ Log entry parsed successfully" DISPLAY-EXTRACTION-RESULTS. DISPLAY "📊 Position Processing Results:" DISPLAY " Records processed: " WS-PROCESSING-COUNT DISPLAY " Extractions: " WS-EXTRACTION-COUNT DISPLAY " Errors: " WS-POSITION-ERRORS DISPLAY " " DISPLAY "Extracted log components:" DISPLAY " Date: " WS-LOG-DATE DISPLAY " Time: " WS-LOG-TIME DISPLAY " Level: " WS-LOG-LEVEL DISPLAY " Message: " WS-LOG-MESSAGE