如何在COBOL中按逗号分隔文本行?问题排查与正确实现
解决COBOL中逗号分隔文本的字段拆分问题
我正在学习COBOL,需要处理包含逗号分隔文本与数字的文件,示例行如下:
1001,John,Doe,Engineer,85000
需求是遇到逗号就停止读取当前字段,将内容存入对应变量,剩余内容继续拆分到下一个变量。最初编写的代码出现异常(比如姓名字段会包含后续所有内容),后来改用UNSTRING语句实现了正确的拆分逻辑。
错误代码示例
IDENTIFICATION DIVISION. PROGRAM-ID. CSV-ERROR. DATA DIVISION. WORKING-STORAGE SECTION. 01 INPUT-LINE PIC X(50). 01 EMP-ID PIC X(4). 01 FIRST-NAME PIC X(10). 01 LAST-NAME PIC X(10). 01 JOB-TITLE PIC X(15). 01 SALARY PIC 9(5). PROCEDURE DIVISION. ACCEPT INPUT-LINE. MOVE INPUT-LINE(1:4) TO EMP-ID. MOVE INPUT-LINE(6:) TO FIRST-NAME. * 硬编码位置截取,未处理逗号分隔,导致FIRST-NAME包含后续所有字段 DISPLAY "EMP-ID: " EMP-ID. DISPLAY "FIRST-NAME: " FIRST-NAME. STOP RUN.
正确代码示例(使用UNSTRING)
IDENTIFICATION DIVISION. PROGRAM-ID. CSV-CORRECT. DATA DIVISION. WORKING-STORAGE SECTION. 01 INPUT-LINE PIC X(50). 01 EMP-ID PIC X(4). 01 FIRST-NAME PIC X(10). 01 LAST-NAME PIC X(10). 01 JOB-TITLE PIC X(15). 01 SALARY PIC 9(5). 01 DELIMITER PIC X VALUE ','. PROCEDURE DIVISION. ACCEPT INPUT-LINE. UNSTRING INPUT-LINE DELIMITED BY DELIMITER INTO EMP-ID, FIRST-NAME, LAST-NAME, JOB-TITLE, SALARY WITH POINTER 1 ON OVERFLOW DISPLAY "字段拆分溢出" NOT ON OVERFLOW DISPLAY "EMP-ID: " EMP-ID DISPLAY "FIRST-NAME: " FIRST-NAME DISPLAY "LAST-NAME: " LAST-NAME DISPLAY "JOB-TITLE: " JOB-TITLE DISPLAY "SALARY: " SALARY END-UNSTRING. STOP RUN.
问题说明与解决方案解析
- 错误代码的核心问题是硬编码字段位置,假设每个字段长度固定,但实际逗号分隔的字段长度可能不固定,导致后续字段被错误包含到前一个变量中。
UNSTRING是COBOL专门用于字符串拆分的语句,通过指定DELIMITED BY ',',可以自动识别逗号作为分隔符,依次将拆分后的内容存入指定变量,无需手动计算字段位置,适配不同长度的字段。- 可选的
WITH POINTER用于控制拆分的起始位置,ON OVERFLOW分支可以处理拆分字段数量超过变量数量的异常情况。
内容的提问来源于stack exchange,提问作者Theo 17
相关产品推荐
相关产品推荐

