MainframeMaster

COBOL Tutorial

COBOL LEFT

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.

LEFT Alignment and Justification

Data Alignment Concepts
cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
*> 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)
Data Alignment
Justification
String Processing

Comprehensive LEFT Processing Examples

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
IDENTIFICATION 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.

LEFT Processing Patterns

Substring Extraction
  • • Extract leftmost characters
  • • Get prefix from strings
  • • Parse delimited data
  • • Isolate leading components
  • • Extract identifiers
Data Alignment
  • • Left-justify text fields
  • • Align report columns
  • • Format display output
  • • Standardize field layout
  • • Maintain consistent formatting

Interactive Tutorial

Hands-On Exercise: String Processing with LEFT Operations
Practice extracting and aligning data using left-oriented operations

Exercise 1: Employee Name Extraction

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
01 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.

Exercise 2: Report Column Alignment

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
01 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.

Best Practices

Knowledge Check

Test Your Understanding

Question 1: Default Alignment

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.

Question 2: Reference Modification

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.

Question 3: Business Applications

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.