SAS Как объединить строки несколько раз в одной и той же переменной во время шага данных

Очень простой вопрос.

Почему я не могу изменить переменную в таком шаге данных?

data want;
   aaaaa='[';
   aaaaa=cats(aaaaa,'hello');
   aaaaa=cats(aaaaa,']');
   put aaaaa;
run;

aaaaa будет равно '[' , я ожидаю '[привет]'

Мне нужно определить aaaaa в несколько шагов, потому что мне нужно построить aaaaa с циклами do (с непредсказуемой длиной), я не могу определить aaaaa всего за один шаг.

Спасибо!


person stallingOne    schedule 14.07.2016    source источник
comment
Вы действительно хотите поставить переменную aaaaa? значение для aaaaa в таблице want равно [hello].   -  person andrey_sz    schedule 14.07.2016
comment
@andrey_sz Да, знаю. Это для создания файла json.   -  person stallingOne    schedule 14.07.2016
comment
Также обратите внимание на call cats, так как это избавит вас от необходимости указывать aaaaa = cats(aaaaa, ......)   -  person Longfish    schedule 14.07.2016
comment
@Keith aaaaa=cats(aaaaa,'bbbbb'); будет эквивалентно call cats(aaaaa,aaaaa,'bbbbb');? Я не вижу, в чем преимущество этого. Это даже дольше.   -  person stallingOne    schedule 14.07.2016
comment
@ооо нет, это просто call cats(aaaaa,'bbbbb');   -  person Longfish    schedule 14.07.2016
comment
@ooo Я добавлю пример в качестве ответа   -  person Longfish    schedule 14.07.2016


Ответы (3)


При первом вызове aaaaa SAS присвоит переменной длину. В этом случае length aaaaa $1 вы назначаете только один символ. Типы данных SAS не являются динамическими. Начните свой шаг данных, назначив вашей переменной фиксированную длину, которая покрывает максимальную ожидаемую длину, например.

data want;
    length aaaaa $300;
    aaaaa='[';
    aaaaa=cats(aaaaa,'hello');
    aaaaa=cats(aaaaa,']');
    put aaaaa;
run;
person Jetzler    schedule 14.07.2016
comment
Я был почти уверен, что это была какая-то глупость, которую я пропустил :-). Спасибо! - person stallingOne; 14.07.2016

Вы можете добавить оператор attrib или format к шагу данных:

data want;
   attrib 
      aaaaa format=$200.;
   aaaaa='[';
   aaaaa=cats(aaaaa,'hello');
   aaaaa=cats(aaaaa,']');
   put aaaaa;
run;
person andrey_sz    schedule 14.07.2016

Согласно моим комментариям, вот альтернативный способ использования call cats.

data want;
length aaaaa $300;
call cats(aaaaa,'[');
call cats(aaaaa,'Hello');
call cats(aaaaa,']');
run;
person Longfish    schedule 14.07.2016