You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:39:58