分割分隔符的代码字符串

问题描述:

我是学习Progress OpenEdge的新手。我有一个关于如何从用户分割字符串输入以在一个过程中用分隔符获取输出的问题。分割分隔符的代码字符串

例如,

随着输入

"A0020000A103A0A0A0A501A4A405A5A5A5A5A5" 

输出应为:

HEADER LEN DATA 
------------- ------ -------------- 
A0    02 0000 
A1    03 A0A0A0 
A5    01 A4 
A4    05 A5A5A5A5A5 

或者

随着输入:

"B103X0X0X0C204B1B1B1B1A209C2C2C2C2C2C2C2C2C2X301A2" 

输出:

HEADER LEN DATA 
------------- ------ ----------------------- 
B1    03 X0X0X0 
C2    04 B1B1B1B1 
A2    09 C2C2C2C2C2C2C2C2C2 
X3    01 A2 
+0

用你的例子,可以说,可以有2个字符为“Header”和“Len”制作头像。但是,您如何确定“数据”的字符数。应该有一些标准来分割字符串。什么是标准? 而且,你是否编写了一些代码来实现这个目标?如果是,发布代码。 OpenEdge版本和操作系统信息也会对其他人建议你有所帮助。 – Austin

我试图从你的输出反向工程您的要求。

它看起来像数据是在两个字符的块。一个“标题”后跟一个“计数器”字段,然后是计数器指示的多个双字符“数据”字段。

这似乎打破了在你想要的方式串:

define variable data as character no-undo format "x(60)". 

function getElements returns integer (input str as character): 
    return integer(substring(str, 1, 2)). 
end. 


function getData returns character (input str as character): 
    return substring(str, 3, getElements(str) * 2). 
end. 

procedure parse: 

    define input parameter str as character no-undo. 

    define variable ii as integer no-undo. 
    define variable jj as integer no-undo. 

    define variable nn as integer no-undo. 

    nn = length(str). 
    ii = 1. 

    do while ii < nn: 

    display 
     substring(str, ii, 2) 
     substring(str, ii + 2, 2) 
    . 

    data = getData(substring(str, ii + 2)). 

    display data. 

    pause. 

    ii = ii + 4 + length(data). 

    end. 

    return. 

end. 

run parse ("A0020000A103A0A0A0A501A4A405A5A5A5A5A5"). 
run parse ("B103X0X0X0C204B1B1B1B1A209C2C2C2C2C2C2C2C2C2X301A2"). 

return. 

同为汤姆的答案,但没有的功能,并显示格式。

procedure parse: 
    define input parameter i_c as character no-undo. 

    def var itotal as int no-undo. 
    def var ipos as int no-undo initial 1. 

    def var cheader as char no-undo label "Header" format "x(2)". 
    def var ilen as int no-undo label "Len" format "99". 
    def var cdata as char no-undo label "Data" format "x(50)". 

    itotal = length(i_c). 

    repeat while ipos < itotal: 

    assign 
     cheader = substring(i_c, ipos, 2) 
     ilen = integer(substring(i_c, ipos + 2, 2)) 
     cdata = substring(i_c, ipos + 4, 2 * ilen)    
     ipos = ipos + 4 + ilen * 2 
     . 

    display 
     cheader 
     ilen 
     cdata 
    with width 70. 

    end. 

end procedure. 

run parse ("A0020000A103A0A0A0A501A4A405A5A5A5A5A5"). 
run parse ("B103X0X0X0C204B1B1B1B1A209C2C2C2C2C2C2C2C2C2X301A2"). 
  • 用标签和格式变量用于
  • 重复有块处理,以便所有记录都显示在下面互相
  • 我充分认识到,汤姆会抱怨变量名称的数据类型的前缀,但他们击败了地狱中的二,jj和nn,并使用受让名称,以避免与进度关键字冲突是不值得的(imho)
+1

现在我有义务抱怨;)通常我只是说“我”和“j”,但我发现ii和jj的想法更容易被搜索到,是一种有吸引力的东西,所以我认为我会尝试一下,看看它的样子,然后检查一下,看看我的手指在打字后是否会燃烧。 –

+1

单字符变量是引入16位cpus时应该消失的可憎行为。严格编译选项的另一个选项;-) –

+1

我一直很喜欢我,j和k for循环计数器:) –