如何在SAS中创建动态字符串?

时间:2019-05-03 16:58:22

标签: sas

我必须根据不同的输入创建动态字符串。在下面的示例中将会更加清楚。

我将获得两个输入

  1. 零数-4
  2. 字符串长度-10

然后我必须像下面那样准备字符串

(0,0,0,0,1,1,1,1,1,1)。

我知道我们必须在问题中添加一些代码,但是我对编码和SAS还是陌生的,因此我无法从任何内容入手。任何帮助将不胜感激。谢谢

3 个答案:

答案 0 :(得分:0)

您可以使用宏或数据步骤使其动态。请参阅以下代码:

options merror nomlogic mprint nosymbolgen;
/*Input number of Zeroes and length of string*/
%let num_zero=5;
%let strln=8;

/*Automatic calculation of length including commas*/
%let len=%eval(&strln+(&strln-1));

data str;
length strval $&len;
 num_z=symget("num_zero");
 stln=symget("strln");
 num_1=stln-num_z;

 do i=1 to num_z;
    strval=catx(",",strval,"0");
 end;
 do j=1 to num_1;
    strval=catx(",",strval,"1");
 end;
 drop num_z stln num_1 i j;
run;

proc print data=str; run;

答案 1 :(得分:0)

这是在数据步骤中执行此操作的简单方法。

data test;
 input nzero totaln;
 length string $200;
  do i=1 to totaln;
    string=catx(',',string,i>nzero);
  end;
  string=cats('(',string,')');
  put string=;
  drop i;
cards;
4 10
5 6
7 7
0 10
;
proc print; run;

结果:

Obs    nzero    totaln    string

 1       4        10      (0,0,0,0,1,1,1,1,1,1)
 2       5         6      (0,0,0,0,0,1)
 3       7         7      (0,0,0,0,0,0,0)
 4       0        10      (1,1,1,1,1,1,1,1,1,1)

或者您可以制作一个宏来生成它。

%macro generate(nzero,totaln);
%local i sep;
(%do i=1 %to &totaln;&sep.%eval(&i>&nzero)%let sep=,;%end;)
%mend generate;

测试结果:

205   %put %generate(4,10);
(0,0,0,0,1,1,1,1,1,1)
206   %put %generate(5,6);
(0,0,0,0,0,1)
207   %put %generate(7,7);
(0,0,0,0,0,0,0)
208   %put %generate(0,10);
(1,1,1,1,1,1,1,1,1,1)

答案 2 :(得分:0)

您也可以使用repeat()函数而不是使用循环来实现。我以为可以简化事情,但是对于这个确切的请求,它仍然有点混乱:

data want;
  length x $200;
  num_zero = 4;
  length_of_string = 10;  
  x = cats('(',substr(cats(repeat('0,', num_zero-1), repeat('1,', length_of_string-num_zero-1)),1,length_of_string*2-1),')');
run;