Объедините значения одного столбца в одну строку - PullRequest
0 голосов
/ 13 июля 2020

Это может показаться неудобным, но у меня есть требование, чтобы у меня была возможность объединить все значения столбца char из набора данных в одну строку. Например:

data person;
   input attribute_name $ dept $;
   datalines;
John Sales
Mary Acctng
skrill Bish
;
run;

Результат: test_conct = "JohnMarySkrill" Столбец может различаться по количеству строк во входном наборе данных. Итак, я попробовал приведенный ниже код, но он выдает ошибку, когда длина объединенной строки (samplkey) превышает 32 КБ.

DATA RECKEYS(KEEP=test_conct);
length samplkey $32767;

do until(eod); 
    SET person END=EOD;
    if lengthn(attribute_name) > 0 then do;
       test_conct = catt(test_conct, strip(attribute_name));
       end;
    end;
output; stop;
run;

Может ли кто-нибудь предложить лучший способ сделать это, может сломаться столбец на фрагменты макросов длиной 32 КБ?

С уважением

Ответы [ 2 ]

0 голосов
/ 13 июля 2020
 data person;
   input attribute_name $ dept $;
   datalines;
John Sales
Mary Acctng
skrill Bish
;
run;

data abc;
  length mvarlist value_list $32000 mvar $32;
  retain mvarlist;
  varnum+1;
  do until(length(value_list)>30000 or eof);
    set person end=eof;
    value_list=catt(value_list,trim(attribute_name));
  end;
  mvar=cats('hicno_list',varnum);
  call symputx(mvar,value_list);
  mvarlist=cats(mvarlist,'&'||mvar);
  if eof then call symputx('hicno_list',mvarlist);
run;
proc ds2;
data t;
/*length long_var varchar(10000000);*/
declare varchar(10000000) long_var;
long_var =put(md5(strip("&hicno_list.")),$hex32.);
run;  
quit;

Но при попытке объединить эти отдельные макроварки по-прежнему выдает следующую ошибку:

ERROR: The text expression length (90057) exceeds maximum length (65534). The text expression has been truncated to 65534 
       characters.
0 голосов
/ 13 июля 2020

Было бы очень полезно, если бы вы указали, что вы пытаетесь сделать, но быстрый метод - использовать SQL

proc sql NOPRINT;
select name into :name_list separated by ""
from sashelp.class;
quit;

%put &name_list.;

Как вы указали, макропеременные имеют ограничение на размер ( 64k символов) в большинстве установок сейчас. В зависимости от того, что вы делаете, лучшим методом может быть создание макроса, который помещает весь список по мере необходимости туда, где когда-либо требуется go динамически, но вам нужно будет объяснить использование, чтобы кто-нибудь предложил этот вариант. Это отвечает на ваш вопрос в том виде, в каком он был опубликован.

Попробуйте это, используя параметр VARCHAR (). Если вы используете более старую версию SAS, это может не работать.

data _null_;
set sashelp.class(keep = name) end=eof;
length long_var varchar(1000000);
length want $256.;

retain long_var;

long_var = catt(long_var, name);

if eof then do;
want = md5(long_var);
put want;
end;


run;
...