2016-10-06 5 views
0

У меня есть набор данных, который имеет один столбец, и п строк, как это:САС Функция CATx удаляет пробелы

DataSet1:

Column1 
-------- 
AAA AAA 
BBB BBB 
CCC CCC 
DDD DDD 
EEE EEE 

Я хочу сделать из этих данных 1 строки, как:

«AAA AAA» n «BBB BBB» n «CCC CCC» n «DDD DDD» n «EEE EEE» n

Я сделаю это макросом.

Я использовал как catx функция. Но функция удаляет пробелы из данных ..

Я использовал сделать петлю, как это:

. 
. 
. 
. 
data _NULL_; 
      if &I^=1 then do; 
      frstclmn=&frstclmn||""""||"&clmn"||""""||"n "; 
     end; 
     run; 
. 
. 
. 

Но я не мог Ассинг переменную в делать обкорнать в заявлении данных с самим собой.

Как я могу это сделать? Благодаря

Edit:

%MACRO result; 
     data _NULL_; 
      set &LIB_NAME..column_list; 
      retain namelist; 
      length namelist $5000; 
      namelist=catx(' ',namelist,cats('"',name,'"n')); 
     run; 

---how can I use "namelist" variable here ? out of data statement.--- 

%MEND result; 

Этот код работает отлично. Теперь я хочу использовать эту переменную namelist из этого оператора данных. Если я печатаю вот так% put & namelist =; Он показывает неправильный результат в макросе. Я хочу использовать этот результат переменной в макроре другой инструкции.

+0

Я понятия не имею, где макросы входят в это, вы хотите помочь с этим на макроязыке, вам нужно будет предоставить больше кода, чем это. – Joe

+0

И - да, catx удаляет пробелы, это своего рода одна из его целей. Вы даже не объяснили, что вы делаете с CATX. – Joe

ответ

1

sql метод data _null_ показывает выше, является лучшим методом, но если вы собираетесь сделать это на этапе данных, используйте ' ' в качестве разделителя.

data _NULL_; 
     set sashelp.class; 
     retain namelist; 
     length namelist $500; 
     namelist=catx(' ',namelist,cats('"',name,'"n')); 
     put namelist=; 
    run; 

Конечно, вы могли бы использовать quote или nliteral, как для лучшего эффекта.

data _NULL_; 
     set sashelp.class; 
     retain namelist; 
     length namelist $500; 
     namelist=catx(' ',namelist,nliteral(name)); 
     put namelist=; 
    run; 
+0

Этот код работает, спасибо. Как я могу использовать эту переменную namelist из инструкции данных. Когда я запускаю макрос% put & namelist =; он показывает неправильный результат. – user3646666

+0

'CALL SYMPUTX', чтобы сделать из него макрокоманду, если вы пытаетесь сделать это Но вы действительно должны объяснить больше в вопросе. И рассмотрите другой ответ, это будет более охотно дать вам ваш результат, я думаю. – Joe

+0

Прошу прощения за недостающую информацию. Не могли бы вы объяснить, как я могу использовать вне утверждения? – user3646666

4

Неясно, какой результат вы ищете. Возможно, это даст вам несколько советов.

data names; 
    input name $32.; 
    cards; 
AAA AAA 
BBB BBB 
CCC CCC 
DDD DDD 
EEE EEE 
;;;; 
    run; 
proc sql noprint; 
    select nliteral(name) into :namelist separated by ' ' from names; 
    quit; 
    run; 
%put NOTE: &=namelist; 

NOTE: NAMELIST="AAA AAA"N "BBB BBB"N "CCC CCC"N "DDD DDD"N "EEE EEE"N 
+1

Ницца! Я никогда раньше не видел функцию «nliteral». Я делаю вещи трудный путь = ( –

+0

Этот код также запускается, но не в моем макросе :( – user3646666

+0

@ user3646666 Этот комментарий не имеет смысла. –