MainframeMaster

COBOL Data Parsing Concepts

Data parsing in COBOL involves breaking down complex data strings into individual components, extracting specific information from formatted data, and converting data from one format to another. This includes string parsing, delimiter-based extraction, fixed-width parsing, and data validation. Understanding data parsing concepts is essential for processing external data, handling user input, and working with various data formats in COBOL applications.

Understanding Data Parsing

Data parsing in COBOL encompasses all methods of extracting specific information from complex data strings, including delimiter-based parsing, fixed-width parsing, pattern matching, and data validation. Proper parsing techniques ensure accurate data extraction, handle various input formats, and provide robust error handling. Different parsing methods are appropriate for different data formats and requirements.

Basic Parsing Techniques

1. UNSTRING Statement Parsing

The UNSTRING statement is the primary tool for parsing delimited strings in COBOL. It splits a source string into multiple target fields based on specified delimiters and parsing rules. UNSTRING supports various delimiters, multiple parsing operations, and error handling for robust data extraction.

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
IDENTIFICATION DIVISION. PROGRAM-ID. DATA-PARSING-BASICS. *> This program demonstrates basic data parsing concepts DATA DIVISION. WORKING-STORAGE SECTION. *> Parsing data structures 01 PARSING-DATA. 05 SOURCE-STRING PIC X(100). 05 PARSED-FIELDS. 10 FIELD-1 PIC X(20). 10 FIELD-2 PIC X(20). 10 FIELD-3 PIC X(20). 10 FIELD-4 PIC X(20). 10 FIELD-5 PIC X(20). 01 PARSING-CONTROLS. 05 DELIMITER-TYPE PIC X(1). 88 COMMA-DELIMITED VALUE 'C'. 88 PIPE-DELIMITED VALUE 'P'. 88 TAB-DELIMITED VALUE 'T'. 88 SPACE-DELIMITED VALUE 'S'. 05 PARSING-STATUS PIC X(1). 88 PARSING-SUCCESS VALUE 'S'. 88 PARSING-FAILURE VALUE 'F'. 01 PARSING-RESULTS. 05 FIELDS-PARSED PIC 9(2). 05 DELIMITER-COUNT PIC 9(2). 05 REMAINING-CHARACTERS PIC 9(2). 01 TEST-STRINGS. 05 COMMA-STRING PIC X(50) VALUE 'John,Smith,25,Engineer,New York'. 05 PIPE-STRING PIC X(50) VALUE 'Mary|Johnson|30|Manager|Chicago'. 05 TAB-STRING PIC X(50) VALUE 'Bob Davis 35 Analyst Houston'. 05 SPACE-STRING PIC X(50) VALUE 'Sue Wilson 28 Designer Phoenix'. PROCEDURE DIVISION. DATA-PARSING-MAIN. DISPLAY 'Data Parsing Concepts Demonstration' DISPLAY '==================================' *> Demonstrate comma-delimited parsing PERFORM DEMONSTRATE-COMMA-PARSING *> Demonstrate pipe-delimited parsing PERFORM DEMONSTRATE-PIPE-PARSING *> Demonstrate tab-delimited parsing PERFORM DEMONSTRATE-TAB-PARSING *> Demonstrate space-delimited parsing PERFORM DEMONSTRATE-SPACE-PARSING STOP RUN. DEMONSTRATE-COMMA-PARSING. *> Demonstrate comma-delimited parsing DISPLAY 'Comma-Delimited Parsing:' DISPLAY 'Source: ' COMMA-STRING MOVE COMMA-STRING TO SOURCE-STRING SET COMMA-DELIMITED TO TRUE PERFORM PARSE-DELIMITED-STRING DISPLAY 'Parsed Fields:' DISPLAY ' Field 1: ' FIELD-1 DISPLAY ' Field 2: ' FIELD-2 DISPLAY ' Field 3: ' FIELD-3 DISPLAY ' Field 4: ' FIELD-4 DISPLAY ' Field 5: ' FIELD-5 DISPLAY ' Fields Parsed: ' FIELDS-PARSED DISPLAY ' '. DEMONSTRATE-PIPE-PARSING. *> Demonstrate pipe-delimited parsing DISPLAY 'Pipe-Delimited Parsing:' DISPLAY 'Source: ' PIPE-STRING MOVE PIPE-STRING TO SOURCE-STRING SET PIPE-DELIMITED TO TRUE PERFORM PARSE-DELIMITED-STRING DISPLAY 'Parsed Fields:' DISPLAY ' Field 1: ' FIELD-1 DISPLAY ' Field 2: ' FIELD-2 DISPLAY ' Field 3: ' FIELD-3 DISPLAY ' Field 4: ' FIELD-4 DISPLAY ' Field 5: ' FIELD-5 DISPLAY ' Fields Parsed: ' FIELDS-PARSED DISPLAY ' '. DEMONSTRATE-TAB-PARSING. *> Demonstrate tab-delimited parsing DISPLAY 'Tab-Delimited Parsing:' DISPLAY 'Source: ' TAB-STRING MOVE TAB-STRING TO SOURCE-STRING SET TAB-DELIMITED TO TRUE PERFORM PARSE-DELIMITED-STRING DISPLAY 'Parsed Fields:' DISPLAY ' Field 1: ' FIELD-1 DISPLAY ' Field 2: ' FIELD-2 DISPLAY ' Field 3: ' FIELD-3 DISPLAY ' Field 4: ' FIELD-4 DISPLAY ' Field 5: ' FIELD-5 DISPLAY ' Fields Parsed: ' FIELDS-PARSED DISPLAY ' '. DEMONSTRATE-SPACE-PARSING. *> Demonstrate space-delimited parsing DISPLAY 'Space-Delimited Parsing:' DISPLAY 'Source: ' SPACE-STRING MOVE SPACE-STRING TO SOURCE-STRING SET SPACE-DELIMITED TO TRUE PERFORM PARSE-DELIMITED-STRING DISPLAY 'Parsed Fields:' DISPLAY ' Field 1: ' FIELD-1 DISPLAY ' Field 2: ' FIELD-2 DISPLAY ' Field 3: ' FIELD-3 DISPLAY ' Field 4: ' FIELD-4 DISPLAY ' Field 5: ' FIELD-5 DISPLAY ' Fields Parsed: ' FIELDS-PARSED DISPLAY ' '. PARSE-DELIMITED-STRING. *> Parse string based on delimiter type MOVE 0 TO FIELDS-PARSED MOVE 0 TO DELIMITER-COUNT MOVE 0 TO REMAINING-CHARACTERS IF COMMA-DELIMITED PERFORM PARSE-COMMA-DELIMITED ELSE IF PIPE-DELIMITED PERFORM PARSE-PIPE-DELIMITED ELSE IF TAB-DELIMITED PERFORM PARSE-TAB-DELIMITED ELSE IF SPACE-DELIMITED PERFORM PARSE-SPACE-DELIMITED END-IF END-IF END-IF END-IF. PARSE-COMMA-DELIMITED. *> Parse comma-delimited string UNSTRING SOURCE-STRING DELIMITED BY ',' INTO FIELD-1 FIELD-2 FIELD-3 FIELD-4 FIELD-5 TALLYING IN FIELDS-PARSED WITH POINTER PARSING-POINTER END-UNSTRING SET PARSING-SUCCESS TO TRUE. PARSE-PIPE-DELIMITED. *> Parse pipe-delimited string UNSTRING SOURCE-STRING DELIMITED BY '|' INTO FIELD-1 FIELD-2 FIELD-3 FIELD-4 FIELD-5 TALLYING IN FIELDS-PARSED WITH POINTER PARSING-POINTER END-UNSTRING SET PARSING-SUCCESS TO TRUE. PARSE-TAB-DELIMITED. *> Parse tab-delimited string UNSTRING SOURCE-STRING DELIMITED BY X'09' INTO FIELD-1 FIELD-2 FIELD-3 FIELD-4 FIELD-5 TALLYING IN FIELDS-PARSED WITH POINTER PARSING-POINTER END-UNSTRING SET PARSING-SUCCESS TO TRUE. PARSE-SPACE-DELIMITED. *> Parse space-delimited string UNSTRING SOURCE-STRING DELIMITED BY SPACE INTO FIELD-1 FIELD-2 FIELD-3 FIELD-4 FIELD-5 TALLYING IN FIELDS-PARSED WITH POINTER PARSING-POINTER END-UNSTRING SET PARSING-SUCCESS TO TRUE.

This example demonstrates basic data parsing concepts using the UNSTRING statement with different delimiters. The program shows how to parse comma-delimited, pipe-delimited, tab-delimited, and space-delimited strings, extracting individual fields and tracking parsing results. The examples illustrate different delimiter types and how to handle various input formats commonly encountered in data processing applications.

2. Advanced Parsing Techniques

Advanced parsing techniques include complex delimiter handling, fixed-width parsing, pattern matching, data validation, and error recovery. These techniques provide more sophisticated ways to extract data from complex formats and handle parsing errors gracefully.

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
IDENTIFICATION DIVISION. PROGRAM-ID. ADVANCED-PARSING-TECHNIQUES. *> This program demonstrates advanced data parsing techniques DATA DIVISION. WORKING-STORAGE SECTION. *> Advanced parsing data structures 01 COMPLEX-PARSING-DATA. 05 COMPLEX-SOURCE PIC X(200). 05 PARSED-COMPONENTS. 10 COMPONENT-1 PIC X(30). 10 COMPONENT-2 PIC X(30). 10 COMPONENT-3 PIC X(30). 10 COMPONENT-4 PIC X(30). 10 COMPONENT-5 PIC X(30). 10 COMPONENT-6 PIC X(30). 01 FIXED-WIDTH-DATA. 05 FIXED-SOURCE PIC X(100). 05 FIXED-FIELDS. 10 FIELD-1 PIC X(10). 10 FIELD-2 PIC X(15). 10 FIELD-3 PIC X(20). 10 FIELD-4 PIC X(25). 10 FIELD-5 PIC X(30). 01 PATTERN-MATCHING-DATA. 05 PATTERN-SOURCE PIC X(150). 05 MATCHED-PATTERNS. 10 EMAIL-PATTERN PIC X(50). 10 PHONE-PATTERN PIC X(15). 10 DATE-PATTERN PIC X(10). 10 NUMBER-PATTERN PIC X(20). 01 PARSING-VALIDATION. 05 VALIDATION-STATUS PIC X(1). 88 VALIDATION-PASSED VALUE 'P'. 88 VALIDATION-FAILED VALUE 'F'. 05 VALIDATION-ERRORS PIC 9(2). 05 VALIDATION-MESSAGE PIC X(100). 01 TEST-DATA-SETS. 05 COMPLEX-STRING PIC X(100) VALUE 'Name:John Smith,Age:25,City:New York,State:NY,Zip:10001,Phone:555-123-4567'. 05 FIXED-WIDTH-STRING PIC X(100) VALUE 'John Smith 25 New York NY 10001'. 05 PATTERN-STRING PIC X(100) VALUE 'Contact: john@email.com Phone: 555-123-4567 Date: 12/01/2023 Amount: $1,234.56'. PROCEDURE DIVISION. ADVANCED-PARSING-MAIN. DISPLAY 'Advanced Parsing Techniques Demonstration' DISPLAY '========================================' *> Demonstrate complex delimiter parsing PERFORM DEMONSTRATE-COMPLEX-DELIMITER-PARSING *> Demonstrate fixed-width parsing PERFORM DEMONSTRATE-FIXED-WIDTH-PARSING *> Demonstrate pattern matching PERFORM DEMONSTRATE-PATTERN-MATCHING *> Demonstrate parsing validation PERFORM DEMONSTRATE-PARSING-VALIDATION STOP RUN. DEMONSTRATE-COMPLEX-DELIMITER-PARSING. *> Demonstrate complex delimiter parsing DISPLAY 'Complex Delimiter Parsing:' DISPLAY 'Source: ' COMPLEX-STRING MOVE COMPLEX-STRING TO COMPLEX-SOURCE PERFORM PARSE-COMPLEX-DELIMITERS DISPLAY 'Parsed Components:' DISPLAY ' Component 1: ' COMPONENT-1 DISPLAY ' Component 2: ' COMPONENT-2 DISPLAY ' Component 3: ' COMPONENT-3 DISPLAY ' Component 4: ' COMPONENT-4 DISPLAY ' Component 5: ' COMPONENT-5 DISPLAY ' Component 6: ' COMPONENT-6 DISPLAY ' '. PARSE-COMPLEX-DELIMITERS. *> Parse complex delimited string UNSTRING COMPLEX-SOURCE DELIMITED BY ',' INTO COMPONENT-1 COMPONENT-2 COMPONENT-3 COMPONENT-4 COMPONENT-5 COMPONENT-6 TALLYING IN FIELDS-PARSED END-UNSTRING *> Further parse each component PERFORM PARSE-COMPONENT-1 PERFORM PARSE-COMPONENT-2 PERFORM PARSE-COMPONENT-3 PERFORM PARSE-COMPONENT-4 PERFORM PARSE-COMPONENT-5 PERFORM PARSE-COMPONENT-6. PARSE-COMPONENT-1. *> Parse first component (Name:John Smith) UNSTRING COMPONENT-1 DELIMITED BY ':' INTO TEMP-FIELD-1 TEMP-FIELD-2 END-UNSTRING MOVE TEMP-FIELD-2 TO COMPONENT-1. PARSE-COMPONENT-2. *> Parse second component (Age:25) UNSTRING COMPONENT-2 DELIMITED BY ':' INTO TEMP-FIELD-1 TEMP-FIELD-2 END-UNSTRING MOVE TEMP-FIELD-2 TO COMPONENT-2. PARSE-COMPONENT-3. *> Parse third component (City:New York) UNSTRING COMPONENT-3 DELIMITED BY ':' INTO TEMP-FIELD-1 TEMP-FIELD-2 END-UNSTRING MOVE TEMP-FIELD-2 TO COMPONENT-3. PARSE-COMPONENT-4. *> Parse fourth component (State:NY) UNSTRING COMPONENT-4 DELIMITED BY ':' INTO TEMP-FIELD-1 TEMP-FIELD-2 END-UNSTRING MOVE TEMP-FIELD-2 TO COMPONENT-4. PARSE-COMPONENT-5. *> Parse fifth component (Zip:10001) UNSTRING COMPONENT-5 DELIMITED BY ':' INTO TEMP-FIELD-1 TEMP-FIELD-2 END-UNSTRING MOVE TEMP-FIELD-2 TO COMPONENT-5. PARSE-COMPONENT-6. *> Parse sixth component (Phone:555-123-4567) UNSTRING COMPONENT-6 DELIMITED BY ':' INTO TEMP-FIELD-1 TEMP-FIELD-2 END-UNSTRING MOVE TEMP-FIELD-2 TO COMPONENT-6. DEMONSTRATE-FIXED-WIDTH-PARSING. *> Demonstrate fixed-width parsing DISPLAY 'Fixed-Width Parsing:' DISPLAY 'Source: ' FIXED-WIDTH-STRING MOVE FIXED-WIDTH-STRING TO FIXED-SOURCE PERFORM PARSE-FIXED-WIDTH DISPLAY 'Parsed Fields:' DISPLAY ' Field 1 (10 chars): ' FIELD-1 DISPLAY ' Field 2 (15 chars): ' FIELD-2 DISPLAY ' Field 3 (20 chars): ' FIELD-3 DISPLAY ' Field 4 (25 chars): ' FIELD-4 DISPLAY ' Field 5 (30 chars): ' FIELD-5 DISPLAY ' '. PARSE-FIXED-WIDTH. *> Parse fixed-width string using reference modification MOVE FIXED-SOURCE(1:10) TO FIELD-1 MOVE FIXED-SOURCE(11:15) TO FIELD-2 MOVE FIXED-SOURCE(26:20) TO FIELD-3 MOVE FIXED-SOURCE(46:25) TO FIELD-4 MOVE FIXED-SOURCE(71:30) TO FIELD-5. DEMONSTRATE-PATTERN-MATCHING. *> Demonstrate pattern matching DISPLAY 'Pattern Matching:' DISPLAY 'Source: ' PATTERN-STRING MOVE PATTERN-STRING TO PATTERN-SOURCE PERFORM MATCH-PATTERNS DISPLAY 'Matched Patterns:' DISPLAY ' Email: ' EMAIL-PATTERN DISPLAY ' Phone: ' PHONE-PATTERN DISPLAY ' Date: ' DATE-PATTERN DISPLAY ' Number: ' NUMBER-PATTERN DISPLAY ' '. MATCH-PATTERNS. *> Match patterns in source string PERFORM MATCH-EMAIL-PATTERN PERFORM MATCH-PHONE-PATTERN PERFORM MATCH-DATE-PATTERN PERFORM MATCH-NUMBER-PATTERN. MATCH-EMAIL-PATTERN. *> Match email pattern PERFORM VARYING PATTERN-INDEX FROM 1 BY 1 UNTIL PATTERN-INDEX > FUNCTION LENGTH(PATTERN-SOURCE) IF PATTERN-SOURCE(PATTERN-INDEX:1) = '@' PERFORM EXTRACT-EMAIL-ADDRESS EXIT PERFORM END-IF END-PERFORM. EXTRACT-EMAIL-ADDRESS. *> Extract email address from pattern MOVE SPACES TO EMAIL-PATTERN PERFORM VARYING EMAIL-START FROM PATTERN-INDEX BY -1 UNTIL EMAIL-START = 1 OR PATTERN-SOURCE(EMAIL-START:1) = ' ' IF PATTERN-SOURCE(EMAIL-START:1) = ' ' ADD 1 TO EMAIL-START EXIT PERFORM END-IF END-PERFORM PERFORM VARYING EMAIL-END FROM PATTERN-INDEX BY 1 UNTIL EMAIL-END > FUNCTION LENGTH(PATTERN-SOURCE) OR PATTERN-SOURCE(EMAIL-END:1) = ' ' IF PATTERN-SOURCE(EMAIL-END:1) = ' ' SUBTRACT 1 FROM EMAIL-END EXIT PERFORM END-IF END-PERFORM MOVE PATTERN-SOURCE(EMAIL-START:EMAIL-END - EMAIL-START + 1) TO EMAIL-PATTERN. MATCH-PHONE-PATTERN. *> Match phone pattern PERFORM VARYING PATTERN-INDEX FROM 1 BY 1 UNTIL PATTERN-INDEX > FUNCTION LENGTH(PATTERN-SOURCE) IF PATTERN-SOURCE(PATTERN-INDEX:1) >= '0' AND PATTERN-SOURCE(PATTERN-INDEX:1) <= '9' PERFORM EXTRACT-PHONE-NUMBER EXIT PERFORM END-IF END-PERFORM. EXTRACT-PHONE-NUMBER. *> Extract phone number from pattern MOVE SPACES TO PHONE-PATTERN MOVE PATTERN-SOURCE(PATTERN-INDEX:15) TO PHONE-PATTERN. MATCH-DATE-PATTERN. *> Match date pattern PERFORM VARYING PATTERN-INDEX FROM 1 BY 1 UNTIL PATTERN-INDEX > FUNCTION LENGTH(PATTERN-SOURCE) IF PATTERN-SOURCE(PATTERN-INDEX:1) = '/' PERFORM EXTRACT-DATE-PATTERN EXIT PERFORM END-IF END-PERFORM. EXTRACT-DATE-PATTERN. *> Extract date pattern MOVE SPACES TO DATE-PATTERN MOVE PATTERN-SOURCE(PATTERN-INDEX - 2:10) TO DATE-PATTERN. MATCH-NUMBER-PATTERN. *> Match number pattern PERFORM VARYING PATTERN-INDEX FROM 1 BY 1 UNTIL PATTERN-INDEX > FUNCTION LENGTH(PATTERN-SOURCE) IF PATTERN-SOURCE(PATTERN-INDEX:1) = '$' PERFORM EXTRACT-NUMBER-PATTERN EXIT PERFORM END-IF END-PERFORM. EXTRACT-NUMBER-PATTERN. *> Extract number pattern MOVE SPACES TO NUMBER-PATTERN MOVE PATTERN-SOURCE(PATTERN-INDEX:20) TO NUMBER-PATTERN. DEMONSTRATE-PARSING-VALIDATION. *> Demonstrate parsing validation DISPLAY 'Parsing Validation:' PERFORM VALIDATE-PARSED-DATA IF VALIDATION-PASSED DISPLAY ' Validation: PASSED' ELSE DISPLAY ' Validation: FAILED' DISPLAY ' Errors: ' VALIDATION-ERRORS DISPLAY ' Message: ' VALIDATION-MESSAGE END-IF DISPLAY ' '. VALIDATE-PARSED-DATA. *> Validate parsed data MOVE 0 TO VALIDATION-ERRORS SET VALIDATION-PASSED TO TRUE *> Validate email format IF EMAIL-PATTERN NOT = SPACES IF EMAIL-PATTERN NOT CONTAINS '@' ADD 1 TO VALIDATION-ERRORS SET VALIDATION-FAILED TO TRUE MOVE 'Invalid email format' TO VALIDATION-MESSAGE END-IF END-IF *> Validate phone format IF PHONE-PATTERN NOT = SPACES IF PHONE-PATTERN NOT CONTAINS '-' ADD 1 TO VALIDATION-ERRORS SET VALIDATION-FAILED TO TRUE MOVE 'Invalid phone format' TO VALIDATION-MESSAGE END-IF END-IF *> Validate date format IF DATE-PATTERN NOT = SPACES IF DATE-PATTERN NOT CONTAINS '/' ADD 1 TO VALIDATION-ERRORS SET VALIDATION-FAILED TO TRUE MOVE 'Invalid date format' TO VALIDATION-MESSAGE END-IF END-IF.

This example demonstrates advanced parsing techniques including complex delimiter parsing, fixed-width parsing, pattern matching, and parsing validation. The program shows how to handle complex delimited strings with multiple parsing levels, extract data from fixed-width formats using reference modification, match specific patterns like email addresses and phone numbers, and validate parsed data for correctness. These techniques provide robust data extraction capabilities for various input formats.

Parsing Error Handling

1. Error Detection and Recovery

Parsing error handling involves detecting parsing failures, providing fallback mechanisms, and ensuring data integrity when parsing encounters problems. This includes validation of parsed results, error reporting, and recovery procedures to handle parsing errors gracefully.

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
IDENTIFICATION DIVISION. PROGRAM-ID. PARSING-ERROR-HANDLING. *> This program demonstrates parsing error handling DATA DIVISION. WORKING-STORAGE SECTION. *> Error handling data structures 01 PARSING-ERROR-DATA. 05 ERROR-STATUS PIC X(1). 88 PARSING-SUCCESS VALUE 'S'. 88 PARSING-PARTIAL VALUE 'P'. 88 PARSING-FAILURE VALUE 'F'. 05 ERROR-COUNT PIC 9(2). 05 WARNING-COUNT PIC 9(2). 05 RECOVERY-ATTEMPTS PIC 9(2). 05 MAX-RECOVERY-ATTEMPTS PIC 9(2) VALUE 3. 01 PROBLEMATIC-DATA. 05 MALFORMED-STRING PIC X(100) VALUE 'Name:John,Age:25,City:New York,State:NY,Zip:10001,Phone:555-123-4567'. 05 INCOMPLETE-STRING PIC X(100) VALUE 'Name:John,Age:25,City:New York'. 05 EMPTY-STRING PIC X(100) VALUE SPACES. 05 INVALID-DELIMITER PIC X(100) VALUE 'Name:John;Age:25;City:New York;State:NY'. 01 PARSING-RESULTS. 05 PARSED-FIELDS. 10 PARSED-NAME PIC X(20). 10 PARSED-AGE PIC X(5). 10 PARSED-CITY PIC X(20). 10 PARSED-STATE PIC X(5). 10 PARSED-ZIP PIC X(10). 10 PARSED-PHONE PIC X(15). 05 PARSING-STATISTICS. 10 FIELDS-PARSED PIC 9(2). 10 FIELDS-MISSING PIC 9(2). 10 FIELDS-INVALID PIC 9(2). 01 ERROR-MESSAGES. 05 ERROR-MESSAGE PIC X(100). 05 WARNING-MESSAGE PIC X(100). 05 RECOVERY-MESSAGE PIC X(100). PROCEDURE DIVISION. PARSING-ERROR-MAIN. DISPLAY 'Parsing Error Handling Demonstration' DISPLAY '====================================' *> Test various error scenarios PERFORM TEST-MALFORMED-DATA PERFORM TEST-INCOMPLETE-DATA PERFORM TEST-EMPTY-DATA PERFORM TEST-INVALID-DELIMITER STOP RUN. TEST-MALFORMED-DATA. *> Test parsing of malformed data DISPLAY 'Testing Malformed Data:' DISPLAY 'Source: ' MALFORMED-STRING MOVE MALFORMED-STRING TO SOURCE-STRING PERFORM PARSE-WITH-ERROR-HANDLING DISPLAY 'Parsing Results:' DISPLAY ' Status: ' ERROR-STATUS DISPLAY ' Fields Parsed: ' FIELDS-PARSED DISPLAY ' Fields Missing: ' FIELDS-MISSING DISPLAY ' Fields Invalid: ' FIELDS-INVALID DISPLAY ' Error Count: ' ERROR-COUNT DISPLAY ' Warning Count: ' WARNING-COUNT DISPLAY ' '. TEST-INCOMPLETE-DATA. *> Test parsing of incomplete data DISPLAY 'Testing Incomplete Data:' DISPLAY 'Source: ' INCOMPLETE-STRING MOVE INCOMPLETE-STRING TO SOURCE-STRING PERFORM PARSE-WITH-ERROR-HANDLING DISPLAY 'Parsing Results:' DISPLAY ' Status: ' ERROR-STATUS DISPLAY ' Fields Parsed: ' FIELDS-PARSED DISPLAY ' Fields Missing: ' FIELDS-MISSING DISPLAY ' Fields Invalid: ' FIELDS-INVALID DISPLAY ' Error Count: ' ERROR-COUNT DISPLAY ' Warning Count: ' WARNING-COUNT DISPLAY ' '. TEST-EMPTY-DATA. *> Test parsing of empty data DISPLAY 'Testing Empty Data:' DISPLAY 'Source: (empty)' MOVE EMPTY-STRING TO SOURCE-STRING PERFORM PARSE-WITH-ERROR-HANDLING DISPLAY 'Parsing Results:' DISPLAY ' Status: ' ERROR-STATUS DISPLAY ' Fields Parsed: ' FIELDS-PARSED DISPLAY ' Fields Missing: ' FIELDS-MISSING DISPLAY ' Fields Invalid: ' FIELDS-INVALID DISPLAY ' Error Count: ' ERROR-COUNT DISPLAY ' Warning Count: ' WARNING-COUNT DISPLAY ' '. TEST-INVALID-DELIMITER. *> Test parsing with invalid delimiter DISPLAY 'Testing Invalid Delimiter:' DISPLAY 'Source: ' INVALID-DELIMITER MOVE INVALID-DELIMITER TO SOURCE-STRING PERFORM PARSE-WITH-ERROR-HANDLING DISPLAY 'Parsing Results:' DISPLAY ' Status: ' ERROR-STATUS DISPLAY ' Fields Parsed: ' FIELDS-PARSED DISPLAY ' Fields Missing: ' FIELDS-MISSING DISPLAY ' Fields Invalid: ' FIELDS-INVALID DISPLAY ' Error Count: ' ERROR-COUNT DISPLAY ' Warning Count: ' WARNING-COUNT DISPLAY ' '. PARSE-WITH-ERROR-HANDLING. *> Parse with comprehensive error handling MOVE 0 TO ERROR-COUNT MOVE 0 TO WARNING-COUNT MOVE 0 TO FIELDS-PARSED MOVE 0 TO FIELDS-MISSING MOVE 0 TO FIELDS-INVALID *> Check for empty source IF SOURCE-STRING = SPACES SET PARSING-FAILURE TO TRUE MOVE 'Source string is empty' TO ERROR-MESSAGE ADD 1 TO ERROR-COUNT EXIT PARAGRAPH END-IF *> Attempt parsing PERFORM ATTEMPT-PARSING *> Validate parsing results PERFORM VALIDATE-PARSING-RESULTS *> Determine final status IF ERROR-COUNT = 0 AND WARNING-COUNT = 0 SET PARSING-SUCCESS TO TRUE ELSE IF ERROR-COUNT > 0 SET PARSING-FAILURE TO TRUE ELSE SET PARSING-PARTIAL TO TRUE END-IF END-IF. ATTEMPT-PARSING. *> Attempt to parse the source string UNSTRING SOURCE-STRING DELIMITED BY ',' INTO PARSED-NAME PARSED-AGE PARSED-CITY PARSED-STATE PARSED-ZIP PARSED-PHONE TALLYING IN FIELDS-PARSED ON OVERFLOW ADD 1 TO ERROR-COUNT MOVE 'Parsing overflow occurred' TO ERROR-MESSAGE END-UNSTRING. VALIDATE-PARSING-RESULTS. *> Validate parsing results PERFORM VALIDATE-PARSED-NAME PERFORM VALIDATE-PARSED-AGE PERFORM VALIDATE-PARSED-CITY PERFORM VALIDATE-PARSED-STATE PERFORM VALIDATE-PARSED-ZIP PERFORM VALIDATE-PARSED-PHONE *> Check for missing fields COMPUTE FIELDS-MISSING = 6 - FIELDS-PARSED IF FIELDS-MISSING > 0 ADD 1 TO WARNING-COUNT MOVE 'Some fields are missing' TO WARNING-MESSAGE END-IF. VALIDATE-PARSED-NAME. *> Validate parsed name IF PARSED-NAME = SPACES ADD 1 TO FIELDS-INVALID ADD 1 TO ERROR-COUNT END-IF. VALIDATE-PARSED-AGE. *> Validate parsed age IF PARSED-AGE = SPACES ADD 1 TO FIELDS-INVALID ADD 1 TO ERROR-COUNT ELSE IF PARSED-AGE NOT NUMERIC ADD 1 TO FIELDS-INVALID ADD 1 TO ERROR-COUNT END-IF END-IF. VALIDATE-PARSED-CITY. *> Validate parsed city IF PARSED-CITY = SPACES ADD 1 TO FIELDS-INVALID ADD 1 TO ERROR-COUNT END-IF. VALIDATE-PARSED-STATE. *> Validate parsed state IF PARSED-STATE = SPACES ADD 1 TO FIELDS-INVALID ADD 1 TO ERROR-COUNT END-IF. VALIDATE-PARSED-ZIP. *> Validate parsed zip IF PARSED-ZIP = SPACES ADD 1 TO FIELDS-INVALID ADD 1 TO ERROR-COUNT ELSE IF PARSED-ZIP NOT NUMERIC ADD 1 TO FIELDS-INVALID ADD 1 TO ERROR-COUNT END-IF END-IF. VALIDATE-PARSED-PHONE. *> Validate parsed phone IF PARSED-PHONE = SPACES ADD 1 TO FIELDS-INVALID ADD 1 TO ERROR-COUNT ELSE IF PARSED-PHONE NOT CONTAINS '-' ADD 1 TO FIELDS-INVALID ADD 1 TO WARNING-COUNT END-IF END-IF.

This example demonstrates comprehensive parsing error handling including error detection, validation, and recovery procedures. The program shows how to handle various error scenarios such as malformed data, incomplete data, empty data, and invalid delimiters. It includes validation of parsed results, error counting, warning handling, and status determination. The error handling approach ensures robust parsing even when encountering problematic input data.

Best Practices for Data Parsing

Common Parsing Patterns