2013-03-15 3 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 

Я хочу знать, если есть способ упростить итерации «ш # (DELIM)» для того, чтобы сделать что-то вроде:

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

я мог бы сделать функцию с некоторым массивом, чтобы сделать это, но это возможно, изначально на REXX, я просто интересно

Thanks

ответ

9

Конечно, если то, что вы действительно хотите n переменные с именами w1, w2, ... wn:

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

Но Rexx-й способ сделать это с помощью "стволовых массив":

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.0 и n слов в 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

+0

Я думаю, вам нужно условие завершения для цикла DO. Попробуйте добавить разделитель в конец 'MYLINE', затем' DO I = 1 BY 1 UNTIL STRIP (MYLINE) = '' ' – NealB

+0

@NealB Да, это научит меня вводить код без его запуска. Обновлен с 'while myline <> ''', который выполнит эту работу. –

Смежные вопросы