2016-11-13 64 views
0

我是學習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

回答

1

我試圖從你的輸出反向工程您的要求。

它看起來像數據是在兩個字符的塊。一個「標題」後跟一個「計數器」字段,然後是計數器指示的多個雙字符「數據」字段。

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

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. 
1

同爲湯姆的答案,但沒有的功能,並顯示格式。

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循環計數器:) –