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
相关产品推荐
相关产品推荐

