The LEFT concept represents fundamental data alignment and string processing capabilities within COBOL programming environments, encompassing sophisticated left-justification mechanisms, substring extraction operations, and comprehensive text manipulation patterns that enable precise field positioning, character alignment, and string processing control. This concept embodies advanced data formatting principles by supporting automated left-alignment operations, enabling sophisticated string manipulation techniques, and facilitating comprehensive text processing requirements while maintaining data integrity, ensuring consistent field formatting, and supporting complex text handling scenarios across enterprise applications requiring detailed string processing, automated data alignment, and reliable text manipulation with optimized performance characteristics and consistent formatting standards throughout diverse business processing environments.
12345678910111213141516171819202122232425262728293031*> Left-justified field definitions 01 WS-LEFT-ALIGNED-FIELD PIC X(20) JUSTIFIED LEFT. 01 WS-REGULAR-FIELD PIC X(20). *> Default left alignment for alphanumeric 01 WS-NAME-FIELD PIC X(30). 01 WS-ADDRESS-FIELD PIC X(40). *> Left alignment with padding MOVE "JOHN" TO WS-LEFT-ALIGNED-FIELD *> Result: "JOHN " (left-aligned with trailing spaces) MOVE "SMITH" TO WS-REGULAR-FIELD *> Result: "SMITH " (default left alignment) *> Explicit left justification in moves MOVE "DATA" TO WS-NAME-FIELD *> Result: "DATA " (left-justified) *> Reference modification for left substring 01 WS-SOURCE-STRING PIC X(20) VALUE "HELLO WORLD TESTING". 01 WS-LEFT-PART PIC X(10). *> Extract left 10 characters MOVE WS-SOURCE-STRING(1:10) TO WS-LEFT-PART *> Result: "HELLO WORL" *> Left padding with specific characters 01 WS-PADDED-FIELD PIC X(15). MOVE "ABC" TO WS-PADDED-FIELD *> Result: "ABC " (left-aligned with spaces)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500IDENTIFICATION DIVISION. PROGRAM-ID. LEFT-PROCESSING-DEMO. DATA DIVISION. WORKING-STORAGE SECTION. *> Field definitions for left alignment testing 01 WS-TEST-FIELDS. 05 WS-NAME-FIELD PIC X(25). 05 WS-ADDRESS-FIELD PIC X(40). 05 WS-CITY-FIELD PIC X(20). 05 WS-PRODUCT-CODE PIC X(15). *> Source data for testing 01 WS-SOURCE-DATA. 05 WS-SHORT-NAME PIC X(30) VALUE "JOHN". 05 WS-MEDIUM-NAME PIC X(30) VALUE "ELIZABETH". 05 WS-LONG-NAME PIC X(30) VALUE "CHRISTOPHER ALEXANDER". 05 WS-FULL-NAME PIC X(30) VALUE "MAXIMILIAN CHRISTOPHER SMITH". *> Left substring processing 01 WS-STRING-PROCESSING. 05 WS-MAIN-STRING PIC X(50) VALUE "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890". 05 WS-LEFT-5 PIC X(5). 05 WS-LEFT-10 PIC X(10). 05 WS-LEFT-15 PIC X(15). 05 WS-LEFT-20 PIC X(20). *> Dynamic left extraction 01 WS-DYNAMIC-PROCESSING. 05 WS-INPUT-STRING PIC X(40). 05 WS-EXTRACT-LENGTH PIC 9(2). 05 WS-LEFT-RESULT PIC X(40). *> Report formatting with left alignment 01 WS-REPORT-FIELDS. 05 WS-EMPLOYEE-NAME PIC X(30). 05 WS-DEPARTMENT PIC X(20). 05 WS-TITLE PIC X(25). 05 WS-LOCATION PIC X(15). *> Left-aligned report lines 01 WS-REPORT-LINE. 05 WS-NAME-COL PIC X(30). 05 FILLER PIC X(2) VALUE " ". 05 WS-DEPT-COL PIC X(20). 05 FILLER PIC X(2) VALUE " ". 05 WS-TITLE-COL PIC X(25). 05 FILLER PIC X(2) VALUE " ". 05 WS-LOC-COL PIC X(15). *> Customer data processing 01 WS-CUSTOMER-RECORD. 05 WS-CUST-ID PIC X(10). 05 WS-CUST-NAME PIC X(35). 05 WS-CUST-ADDRESS. 10 WS-STREET PIC X(30). 10 WS-CITY PIC X(20). 10 WS-STATE PIC X(2). 10 WS-ZIP PIC X(10). *> Left-trimmed fields for data cleanup 01 WS-TRIMMED-FIELDS. 05 WS-ORIGINAL-DATA PIC X(50). 05 WS-LEFT-TRIMMED PIC X(50). 05 WS-POSITION-COUNTER PIC 9(3). PROCEDURE DIVISION. MAIN-PROCESSING. DISPLAY "=== COBOL LEFT PROCESSING DEMONSTRATION ===" DISPLAY SPACES PERFORM DEMONSTRATE-LEFT-ALIGNMENT PERFORM DEMONSTRATE-LEFT-SUBSTRINGS PERFORM DEMONSTRATE-DYNAMIC-LEFT-EXTRACTION PERFORM DEMONSTRATE-REPORT-FORMATTING PERFORM DEMONSTRATE-DATA-CLEANUP PERFORM DEMONSTRATE-BUSINESS-APPLICATIONS DISPLAY "=== LEFT PROCESSING COMPLETE ===" STOP RUN. DEMONSTRATE-LEFT-ALIGNMENT. DISPLAY "=== LEFT ALIGNMENT DEMONSTRATION ===" DISPLAY SPACES *> Test different name lengths with left alignment MOVE WS-SHORT-NAME TO WS-NAME-FIELD DISPLAY "Short name left-aligned: '" WS-NAME-FIELD "'" MOVE WS-MEDIUM-NAME TO WS-NAME-FIELD DISPLAY "Medium name left-aligned: '" WS-NAME-FIELD "'" MOVE WS-LONG-NAME TO WS-NAME-FIELD DISPLAY "Long name left-aligned: '" WS-NAME-FIELD "'" *> Demonstrate truncation with left alignment MOVE WS-FULL-NAME TO WS-NAME-FIELD DISPLAY "Full name (truncated): '" WS-NAME-FIELD "'" DISPLAY SPACES *> Address field left alignment MOVE "123 MAIN STREET" TO WS-ADDRESS-FIELD DISPLAY "Address left-aligned: '" WS-ADDRESS-FIELD "'" MOVE "APARTMENT 2B, 456 OAK AVENUE, BUILDING C" TO WS-ADDRESS-FIELD DISPLAY "Long address (truncated): '" WS-ADDRESS-FIELD "'" DISPLAY SPACES. DEMONSTRATE-LEFT-SUBSTRINGS. DISPLAY "=== LEFT SUBSTRING EXTRACTION ===" DISPLAY SPACES DISPLAY "Source string: '" WS-MAIN-STRING "'" DISPLAY SPACES *> Extract different left portions MOVE WS-MAIN-STRING(1:5) TO WS-LEFT-5 DISPLAY "Left 5 characters: '" WS-LEFT-5 "'" MOVE WS-MAIN-STRING(1:10) TO WS-LEFT-10 DISPLAY "Left 10 characters: '" WS-LEFT-10 "'" MOVE WS-MAIN-STRING(1:15) TO WS-LEFT-15 DISPLAY "Left 15 characters: '" WS-LEFT-15 "'" MOVE WS-MAIN-STRING(1:20) TO WS-LEFT-20 DISPLAY "Left 20 characters: '" WS-LEFT-20 "'" DISPLAY SPACES *> Progressive left extraction PERFORM VARYING WS-EXTRACT-LENGTH FROM 1 BY 5 UNTIL WS-EXTRACT-LENGTH > 25 MOVE SPACES TO WS-LEFT-RESULT MOVE WS-MAIN-STRING(1:WS-EXTRACT-LENGTH) TO WS-LEFT-RESULT DISPLAY "Left " WS-EXTRACT-LENGTH " chars: '" WS-LEFT-RESULT(1:WS-EXTRACT-LENGTH) "'" END-PERFORM DISPLAY SPACES. DEMONSTRATE-DYNAMIC-LEFT-EXTRACTION. DISPLAY "=== DYNAMIC LEFT EXTRACTION ===" DISPLAY SPACES MOVE "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG" TO WS-INPUT-STRING DISPLAY "Input string: '" WS-INPUT-STRING "'" DISPLAY SPACES *> Extract words from left side PERFORM EXTRACT-LEFT-WORD VARYING WS-POSITION-COUNTER FROM 1 BY 1 UNTIL WS-POSITION-COUNTER > 5 DISPLAY SPACES. EXTRACT-LEFT-WORD. 01 WS-WORD-START PIC 9(3) VALUE 1. 01 WS-WORD-END PIC 9(3). 01 WS-WORD-LENGTH PIC 9(3). 01 WS-EXTRACTED-WORD PIC X(20). 01 WS-SEARCH-POS PIC 9(3) VALUE 1. 01 WS-WORD-COUNT PIC 9(2) VALUE 0. 01 WS-TEMP-CHAR PIC X. *> Find the nth word from the left MOVE 1 TO WS-WORD-START MOVE 0 TO WS-WORD-COUNT PERFORM VARYING WS-SEARCH-POS FROM 1 BY 1 UNTIL WS-SEARCH-POS > 40 MOVE WS-INPUT-STRING(WS-SEARCH-POS:1) TO WS-TEMP-CHAR IF WS-TEMP-CHAR = SPACE OR WS-SEARCH-POS = 40 ADD 1 TO WS-WORD-COUNT IF WS-WORD-COUNT = WS-POSITION-COUNTER COMPUTE WS-WORD-END = WS-SEARCH-POS - 1 COMPUTE WS-WORD-LENGTH = WS-WORD-END - WS-WORD-START + 1 IF WS-WORD-LENGTH > 0 AND WS-WORD-LENGTH <= 20 MOVE WS-INPUT-STRING(WS-WORD-START:WS-WORD-LENGTH) TO WS-EXTRACTED-WORD DISPLAY "Word " WS-POSITION-COUNTER " from left: '" WS-EXTRACTED-WORD(1:WS-WORD-LENGTH) "'" END-IF EXIT PERFORM ELSE MOVE WS-SEARCH-POS TO WS-WORD-START ADD 1 TO WS-WORD-START END-IF END-IF END-PERFORM. DEMONSTRATE-REPORT-FORMATTING. DISPLAY "=== LEFT-ALIGNED REPORT FORMATTING ===" DISPLAY SPACES *> Setup report header DISPLAY "EMPLOYEE REPORT - LEFT ALIGNED COLUMNS" DISPLAY "NAME DEPT " "TITLE LOCATION" DISPLAY "============================== ==================== " "========================= ===============" *> Employee 1 MOVE "JOHN SMITH" TO WS-EMPLOYEE-NAME MOVE "ENGINEERING" TO WS-DEPARTMENT MOVE "SOFTWARE DEVELOPER" TO WS-TITLE MOVE "NEW YORK" TO WS-LOCATION PERFORM FORMAT-EMPLOYEE-LINE *> Employee 2 MOVE "MARY JOHNSON" TO WS-EMPLOYEE-NAME MOVE "MARKETING" TO WS-DEPARTMENT MOVE "MARKETING MANAGER" TO WS-TITLE MOVE "CHICAGO" TO WS-LOCATION PERFORM FORMAT-EMPLOYEE-LINE *> Employee 3 MOVE "ROBERT WILLIAMS" TO WS-EMPLOYEE-NAME MOVE "FINANCE" TO WS-DEPARTMENT MOVE "FINANCIAL ANALYST" TO WS-TITLE MOVE "BOSTON" TO WS-LOCATION PERFORM FORMAT-EMPLOYEE-LINE *> Employee 4 - test long names MOVE "CHRISTOPHER ALEXANDER THOMPSON" TO WS-EMPLOYEE-NAME MOVE "HUMAN RESOURCES" TO WS-DEPARTMENT MOVE "HR GENERALIST SPECIALIST" TO WS-TITLE MOVE "SAN FRANCISCO" TO WS-LOCATION PERFORM FORMAT-EMPLOYEE-LINE DISPLAY SPACES. FORMAT-EMPLOYEE-LINE. MOVE WS-EMPLOYEE-NAME TO WS-NAME-COL MOVE WS-DEPARTMENT TO WS-DEPT-COL MOVE WS-TITLE TO WS-TITLE-COL MOVE WS-LOCATION TO WS-LOC-COL DISPLAY WS-REPORT-LINE. DEMONSTRATE-DATA-CLEANUP. DISPLAY "=== LEFT-BASED DATA CLEANUP ===" DISPLAY SPACES PERFORM LEFT-TRIM-DEMONSTRATION PERFORM LEFT-EXTRACT-UNTIL-DELIMITER PERFORM LEFT-STANDARDIZATION. LEFT-TRIM-DEMONSTRATION. 01 WS-SAMPLE-DATA PIC X(40) VALUE " IMPORTANT DATA HERE ". 01 WS-CLEANED-DATA PIC X(40). 01 WS-TRIM-INDEX PIC 9(3). 01 WS-FIRST-NON-SPACE PIC 9(3) VALUE 0. DISPLAY "Left trim demonstration:" DISPLAY " Original: '" WS-SAMPLE-DATA "'" *> Find first non-space character from left PERFORM VARYING WS-TRIM-INDEX FROM 1 BY 1 UNTIL WS-TRIM-INDEX > 40 IF WS-SAMPLE-DATA(WS-TRIM-INDEX:1) NOT = SPACE MOVE WS-TRIM-INDEX TO WS-FIRST-NON-SPACE EXIT PERFORM END-IF END-PERFORM *> Extract from first non-space to end IF WS-FIRST-NON-SPACE > 0 COMPUTE WS-EXTRACT-LENGTH = 40 - WS-FIRST-NON-SPACE + 1 MOVE WS-SAMPLE-DATA(WS-FIRST-NON-SPACE:WS-EXTRACT-LENGTH) TO WS-CLEANED-DATA DISPLAY " Cleaned: '" WS-CLEANED-DATA "'" ELSE DISPLAY " All spaces - no data to extract" END-IF DISPLAY SPACES. LEFT-EXTRACT-UNTIL-DELIMITER. 01 WS-DELIMITED-DATA PIC X(50) VALUE "FIRST|SECOND|THIRD|FOURTH|FIFTH". 01 WS-LEFT-PART PIC X(20). 01 WS-DELIMITER-POS PIC 9(3) VALUE 0. 01 WS-SEARCH-INDEX PIC 9(3). DISPLAY "Left extraction until delimiter:" DISPLAY " Input: '" WS-DELIMITED-DATA "'" *> Find first delimiter from left PERFORM VARYING WS-SEARCH-INDEX FROM 1 BY 1 UNTIL WS-SEARCH-INDEX > 50 IF WS-DELIMITED-DATA(WS-SEARCH-INDEX:1) = "|" MOVE WS-SEARCH-INDEX TO WS-DELIMITER-POS EXIT PERFORM END-IF END-PERFORM *> Extract left part before delimiter IF WS-DELIMITER-POS > 1 COMPUTE WS-EXTRACT-LENGTH = WS-DELIMITER-POS - 1 MOVE WS-DELIMITED-DATA(1:WS-EXTRACT-LENGTH) TO WS-LEFT-PART DISPLAY " Left part: '" WS-LEFT-PART(1:WS-EXTRACT-LENGTH) "'" ELSE DISPLAY " No delimiter found" END-IF DISPLAY SPACES. LEFT-STANDARDIZATION. 01 WS-INPUT-NAMES. 05 WS-NAME-1 PIC X(30) VALUE "john smith". 05 WS-NAME-2 PIC X(30) VALUE "MARY JOHNSON". 05 WS-NAME-3 PIC X(30) VALUE "Robert Williams". 01 WS-STANDARDIZED-NAME PIC X(30). 01 WS-NAME-INDEX PIC 9(2). DISPLAY "Left-based name standardization:" PERFORM VARYING WS-NAME-INDEX FROM 1 BY 1 UNTIL WS-NAME-INDEX > 3 EVALUATE WS-NAME-INDEX WHEN 1 MOVE WS-NAME-1 TO WS-STANDARDIZED-NAME WHEN 2 MOVE WS-NAME-2 TO WS-STANDARDIZED-NAME WHEN 3 MOVE WS-NAME-3 TO WS-STANDARDIZED-NAME END-EVALUATE DISPLAY " Original: '" WS-STANDARDIZED-NAME "'" *> Convert to proper case (capitalize first letter) PERFORM STANDARDIZE-LEFT-CASE DISPLAY " Standardized: '" WS-STANDARDIZED-NAME "'" DISPLAY SPACES END-PERFORM. STANDARDIZE-LEFT-CASE. 01 WS-CASE-INDEX PIC 9(3). 01 WS-CURRENT-CHAR PIC X. 01 WS-CAPITALIZE-NEXT PIC X VALUE 'Y'. PERFORM VARYING WS-CASE-INDEX FROM 1 BY 1 UNTIL WS-CASE-INDEX > 30 MOVE WS-STANDARDIZED-NAME(WS-CASE-INDEX:1) TO WS-CURRENT-CHAR IF WS-CURRENT-CHAR = SPACE MOVE 'Y' TO WS-CAPITALIZE-NEXT ELSE IF WS-CAPITALIZE-NEXT = 'Y' *> Capitalize first character of word IF WS-CURRENT-CHAR >= 'a' AND WS-CURRENT-CHAR <= 'z' COMPUTE WS-CURRENT-CHAR = FUNCTION ORD(WS-CURRENT-CHAR) - 32 MOVE FUNCTION CHAR(WS-CURRENT-CHAR) TO WS-STANDARDIZED-NAME(WS-CASE-INDEX:1) END-IF MOVE 'N' TO WS-CAPITALIZE-NEXT ELSE *> Convert to lowercase IF WS-CURRENT-CHAR >= 'A' AND WS-CURRENT-CHAR <= 'Z' COMPUTE WS-CURRENT-CHAR = FUNCTION ORD(WS-CURRENT-CHAR) + 32 MOVE FUNCTION CHAR(WS-CURRENT-CHAR) TO WS-STANDARDIZED-NAME(WS-CASE-INDEX:1) END-IF END-IF END-IF END-PERFORM. DEMONSTRATE-BUSINESS-APPLICATIONS. DISPLAY "=== BUSINESS APPLICATIONS OF LEFT PROCESSING ===" DISPLAY SPACES PERFORM CUSTOMER-NAME-PROCESSING PERFORM PRODUCT-CODE-EXTRACTION PERFORM ADDRESS-FORMATTING. CUSTOMER-NAME-PROCESSING. 01 WS-CUSTOMER-NAMES. 05 WS-FULL-NAME-1 PIC X(40) VALUE "SMITH, JOHN DAVID". 05 WS-FULL-NAME-2 PIC X(40) VALUE "JOHNSON, MARY ELIZABETH". 05 WS-FULL-NAME-3 PIC X(40) VALUE "WILLIAMS, ROBERT". 01 WS-LAST-NAME PIC X(20). 01 WS-FIRST-NAME PIC X(20). 01 WS-COMMA-POS PIC 9(3). 01 WS-PROCESSING-INDEX PIC 9(2). DISPLAY "Customer name processing (extract left part - last name):" PERFORM VARYING WS-PROCESSING-INDEX FROM 1 BY 1 UNTIL WS-PROCESSING-INDEX > 3 EVALUATE WS-PROCESSING-INDEX WHEN 1 MOVE WS-FULL-NAME-1 TO WS-ORIGINAL-DATA WHEN 2 MOVE WS-FULL-NAME-2 TO WS-ORIGINAL-DATA WHEN 3 MOVE WS-FULL-NAME-3 TO WS-ORIGINAL-DATA END-EVALUATE DISPLAY " Full name: '" WS-ORIGINAL-DATA "'" *> Find comma position MOVE 0 TO WS-COMMA-POS PERFORM VARYING WS-SEARCH-INDEX FROM 1 BY 1 UNTIL WS-SEARCH-INDEX > 40 IF WS-ORIGINAL-DATA(WS-SEARCH-INDEX:1) = "," MOVE WS-SEARCH-INDEX TO WS-COMMA-POS EXIT PERFORM END-IF END-PERFORM IF WS-COMMA-POS > 0 *> Extract last name (left part before comma) COMPUTE WS-EXTRACT-LENGTH = WS-COMMA-POS - 1 MOVE WS-ORIGINAL-DATA(1:WS-EXTRACT-LENGTH) TO WS-LAST-NAME DISPLAY " Last name: '" WS-LAST-NAME(1:WS-EXTRACT-LENGTH) "'" ELSE DISPLAY " No comma found - cannot extract last name" END-IF DISPLAY SPACES END-PERFORM. PRODUCT-CODE-EXTRACTION. 01 WS-PRODUCT-CODES. 05 WS-PROD-1 PIC X(20) VALUE "ELEC-12345-A". 05 WS-PROD-2 PIC X(20) VALUE "MECH-67890-B". 05 WS-PROD-3 PIC X(20) VALUE "SOFT-11111-C". 01 WS-CATEGORY PIC X(10). 01 WS-DASH-POS PIC 9(3). 01 WS-PROD-INDEX PIC 9(2). DISPLAY "Product code processing (extract left category):" PERFORM VARYING WS-PROD-INDEX FROM 1 BY 1 UNTIL WS-PROD-INDEX > 3 EVALUATE WS-PROD-INDEX WHEN 1 MOVE WS-PROD-1 TO WS-ORIGINAL-DATA WHEN 2 MOVE WS-PROD-2 TO WS-ORIGINAL-DATA WHEN 3 MOVE WS-PROD-3 TO WS-ORIGINAL-DATA END-EVALUATE DISPLAY " Product code: '" WS-ORIGINAL-DATA "'" *> Find first dash from left MOVE 0 TO WS-DASH-POS PERFORM VARYING WS-SEARCH-INDEX FROM 1 BY 1 UNTIL WS-SEARCH-INDEX > 20 IF WS-ORIGINAL-DATA(WS-SEARCH-INDEX:1) = "-" MOVE WS-SEARCH-INDEX TO WS-DASH-POS EXIT PERFORM END-IF END-PERFORM IF WS-DASH-POS > 0 *> Extract category (left part before dash) COMPUTE WS-EXTRACT-LENGTH = WS-DASH-POS - 1 MOVE WS-ORIGINAL-DATA(1:WS-EXTRACT-LENGTH) TO WS-CATEGORY DISPLAY " Category: '" WS-CATEGORY(1:WS-EXTRACT-LENGTH) "'" ELSE DISPLAY " No dash found - cannot extract category" END-IF DISPLAY SPACES END-PERFORM. ADDRESS-FORMATTING. 01 WS-ADDRESS-LINES. 05 WS-ADDR-1 PIC X(50) VALUE "123 MAIN STREET, ANYTOWN, NY 12345". 05 WS-ADDR-2 PIC X(50) VALUE "456 OAK AVENUE, SOMEWHERE, CA 54321". 01 WS-STREET-ADDRESS PIC X(30). 01 WS-ADDR-INDEX PIC 9(2). DISPLAY "Address formatting (extract left street address):" PERFORM VARYING WS-ADDR-INDEX FROM 1 BY 1 UNTIL WS-ADDR-INDEX > 2 EVALUATE WS-ADDR-INDEX WHEN 1 MOVE WS-ADDR-1 TO WS-ORIGINAL-DATA WHEN 2 MOVE WS-ADDR-2 TO WS-ORIGINAL-DATA END-EVALUATE DISPLAY " Full address: '" WS-ORIGINAL-DATA "'" *> Find first comma (end of street address) MOVE 0 TO WS-COMMA-POS PERFORM VARYING WS-SEARCH-INDEX FROM 1 BY 1 UNTIL WS-SEARCH-INDEX > 50 IF WS-ORIGINAL-DATA(WS-SEARCH-INDEX:1) = "," MOVE WS-SEARCH-INDEX TO WS-COMMA-POS EXIT PERFORM END-IF END-PERFORM IF WS-COMMA-POS > 0 *> Extract street address (left part before comma) COMPUTE WS-EXTRACT-LENGTH = WS-COMMA-POS - 1 IF WS-EXTRACT-LENGTH <= 30 MOVE WS-ORIGINAL-DATA(1:WS-EXTRACT-LENGTH) TO WS-STREET-ADDRESS DISPLAY " Street: '" WS-STREET-ADDRESS "'" ELSE MOVE WS-ORIGINAL-DATA(1:30) TO WS-STREET-ADDRESS DISPLAY " Street: '" WS-STREET-ADDRESS "' (truncated)" END-IF ELSE DISPLAY " No comma found - using entire address as street" MOVE WS-ORIGINAL-DATA(1:30) TO WS-STREET-ADDRESS DISPLAY " Street: '" WS-STREET-ADDRESS "'" END-IF DISPLAY SPACES END-PERFORM.
123456789101112131415161718192001 WS-EMPLOYEE-DATA PIC X(40) VALUE "JONES, SARAH M. - SOFTWARE ENGINEER". 01 WS-LAST-NAME PIC X(15). 01 WS-COMMA-POS PIC 9(3). PROCEDURE DIVISION. EXTRACT-LAST-NAME. *> Find comma position PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > 40 IF WS-EMPLOYEE-DATA(WS-INDEX:1) = "," MOVE WS-INDEX TO WS-COMMA-POS EXIT PERFORM END-IF END-PERFORM *> Extract last name (left part before comma) IF WS-COMMA-POS > 0 COMPUTE WS-LENGTH = WS-COMMA-POS - 1 MOVE WS-EMPLOYEE-DATA(1:WS-LENGTH) TO WS-LAST-NAME DISPLAY "Last name: " WS-LAST-NAME END-IF.
12345678910111213141516171801 WS-REPORT-DATA. 05 WS-NAME-COL PIC X(25). 05 WS-DEPT-COL PIC X(20). 05 WS-SALARY-COL PIC X(12). 01 WS-EMPLOYEE-INFO. 05 WS-EMP-NAME PIC X(30) VALUE "JOHN SMITH". 05 WS-EMP-DEPT PIC X(25) VALUE "ENGINEERING". 05 WS-EMP-SALARY PIC X(15) VALUE "$75,000.00". PROCEDURE DIVISION. FORMAT-REPORT-LINE. *> Left-align data in report columns MOVE WS-EMP-NAME TO WS-NAME-COL MOVE WS-EMP-DEPT TO WS-DEPT-COL MOVE WS-EMP-SALARY TO WS-SALARY-COL DISPLAY WS-NAME-COL " " WS-DEPT-COL " " WS-SALARY-COL.
How does COBOL handle left alignment by default?
Answer: COBOL automatically left-aligns alphanumeric data when moved to a field. If the source is shorter than the target, trailing spaces pad the field. This is the default behavior for PIC X fields.
How do you extract the leftmost 10 characters from a string?
Answer: Use reference modification with the syntax string-name(1:10) to extract the first 10 characters from the left side of the string, starting at position 1.
What are common business uses for left-oriented operations?
Answer: Common uses include extracting prefixes from codes, parsing delimited data, formatting report columns, extracting last names from full names, and standardizing text alignment in displays and reports.