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

Progress OpenEdge:如何将分隔符定义为变量?

Progress OpenEdge 动态分隔符使用问题解决方法

问题根源

OpenEdge 的 IMPORT DELIMITER 语法不支持直接传入变量作为分隔符,它要求分隔符必须是编译时可确定的常量值,所以你直接使用变量 cDelimiter 会触发错误。

两种可行解决方案

方案1:使用动态语句执行IMPORT

通过拼接动态字符串生成 IMPORT 命令,实现运行时传入分隔符变量:

iLine = getLastHeaderLine().
cDelimiter = getDelimiter().
// 处理分隔符为单引号的情况,转义成两个单引号避免语法错误
cDelimiter = REPLACE(cDelimiter, "'", "''").

REPEAT:
    IF iLine <= 1 THEN DO:
        IMPORT UNFORMATTED csvRaLine.
    END.
    ELSE DO:
        IMPORT UNFORMATTED csvLine.
        
        DEF VARIABLE cImportStmt AS CHARACTER NO-UNDO.
        // 拼接动态IMPORT语句,直接映射到临时表字段
        cImportStmt = 
            "IMPORT DELIMITER '" + cDelimiter + "' " +
            "INTO ttImportReport (Amount, Category, dDate, cDescription, cState) " +
            "FROM VALUE(csvLine).".
        
        // 执行动态语句
        RUN cImportStmt.
    END.
    iLine = iLine + 1.
END.

方案2:手动拆分CSV行字符串

既然已经通过 IMPORT UNFORMATTED 获取了整行内容,可自行实现字符串拆分逻辑,完全替代 IMPORT DELIMITER:

iLine = getLastHeaderLine().
cDelimiter = getDelimiter().

REPEAT:
    IF iLine <= 1 THEN DO:
        IMPORT UNFORMATTED csvRaLine.
    END.
    ELSE DO:
        IMPORT UNFORMATTED csvLine.
        
        DEF VARIABLE aFields AS CHARACTER EXTENT 5 NO-UNDO.
        DEF VARIABLE iFieldIdx AS INTEGER NO-UNDO.
        DEF VARIABLE iPos AS INTEGER NO-UNDO.
        DEF VARIABLE cTempLine AS CHARACTER NO-UNDO.
        
        cTempLine = csvLine.
        iFieldIdx = 1.
        
        // 循环拆分字段
        DO WHILE iFieldIdx <= EXTENT(aFields):
            iPos = INDEX(cTempLine, cDelimiter).
            IF iPos > 0 THEN DO:
                aFields[iFieldIdx] = TRIM(SUBSTRING(cTempLine, 1, iPos - 1)).
                cTempLine = SUBSTRING(cTempLine, iPos + LENGTH(cDelimiter)).
            END.
            ELSE DO:
                aFields[iFieldIdx] = TRIM(cTempLine).
                LEAVE.
            END.
            iFieldIdx = iFieldIdx + 1.
        END.
        
        // 赋值到临时表
        CREATE ttImportReport.
        ttImportReport.Amount = ParseAmount(aFields[1]).
        ttImportReport.Category = ParseCategory(aFields[2]).
        ttImportReport.dDate = ParseDate(aFields[3]).
        ttImportReport.cDescription = ParseDescription(aFields[4]).
        ttImportReport.cState = ParseState(aFields[5]).
    END.
    iLine = iLine + 1.
END.

方案对比

  • 动态语句方案代码更简洁,但需要注意分隔符的转义处理,若分隔符包含特殊字符(如单引号)需提前处理。
  • 手动拆分方案代码量稍大,但灵活性更高,可轻松扩展处理带引号包裹的特殊CSV字段(如包含分隔符的字段),避免拆分错误。

内容的提问来源于stack exchange,提问作者Mister3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:47:29