2013-03-15 65 views
2

我知道,我們可以分析一個CSV線(「;」分隔符)與類似的東西:的Rexx - 解析CSV行(「;」分隔符)

delim = ';' 
myline="i;want;to;know;what;love;is" 
parse var myline w1 (delim) w2 (delim) w3 (delim) w4 (delim) w5 (delim) w6 (delim) w7 
say w1 w2 w3 w4 w5 w6 w7 

我想知道是否有這樣才能做這樣的事情簡化的迭代「W#(DELIM)」:

parse var myline w1 (delim) w2 (delim) ... (delim) w6 (delim) w7 
/* then we will have all w1 to w7 defined 

我可以做一個函數與一些陣列要做到這一點,但它可能本身就REXX,我只是想知道

謝謝

回答

9

當然,如果你真正想要的是n變量命名w1w2,... wn

do i = 1 by 1 while myline <> '' 
    parse var myline word (delim) myline 
    interpret "w" || i "= word" 
end 

但Rexx的-Y方式做到這一點是使用 「幹陣」:

delim = ';' 
do i = 1 by 1 while myline <> '' 
    parse var myline w.i (delim) myline 
end 
w.0 = i-1 

甚至:

do i = 1 by 1 while myline <> '' 
    parse var myline w.i ';' myline 
end 
w.0 = i-1 

完成後,您將有一個數組w.,其數量爲w.0n單詞爲w.1,w.2,...直到w.n。這樣做更好,因爲Rexx對.之後的零件進行了特殊處理:您可以使用任何變量,而將其值用於替代。因此,打印所有的那些話只是:

do i = 1 to w.0 
    say w.i 
end 

或重新組裝它們就是:

line = "" 
do i = 1 to w.0 
    line = line || w.i || ';' 
end 
+0

我不知道解析被分配剩餘的詞。謝謝,臨屋區幫助我很多。 – user1117862 2013-03-18 18:31:11

+0

我認爲你需要DO循環的終止條件。嘗試在'MYLINE'末尾添加一個分隔符,然後'DO I = 1 BY 1 UNTIL STRIP(MYLINE)=''' – NealB 2013-03-19 21:04:01

+0

@NealB是的,這會教我輸入代碼而不運行它。用'while myline <>'''更新後,就可以完成這項工作。 – 2013-03-19 21:38:38