繁体   English   中英

SAS 循环遍历 56 个字符串每两个字符提取一次

[英]SAS loop through 56 character string extract every two characters

有几百万条带有类似字符串的记录
“00 00 01 00 00 01 00 01 00 00 00 00 01 01 00 01 00 00 00 00 01”
字符串的长度为 56。所有位置都用 0 或 1 填充。
我的工作是每两个位置解析每条记录的字符串
(没有空格,这只是为了澄清)。

如果 position 中有一个 1,则 2 表示增加 var1 +1
如果 position 四个中还有一个 1,(不要关心前面的“0”
在 position 1/3/5/9...55 等)增量 var2 + 1,最多 28 个变量。

整个 56 len 字符串必须每两个字符解析一次。 潜在地
可能有 28 个变量需要增加,(但不现实,
很可能只有五六个)可以在任何部分找到
字符串,从头到尾(只要它们在 position 2/4/6/8 到 56 等)

这是我老板给我的:
如果 substr(BigString,2,1)='1' 那么 var1+1;

好的。 美好的。
A) 字符串中还有 27 个需要评估的地方。
B)有几百万条记录。

28 个嵌套的 if then do 循环听起来不像是一个答案(我能想到的)。 至少对我来说不是。
谢谢。

如果我很好地理解了这个问题,这可能是解决方案: EDITED 2. 解决方案:

/* example with same row*/
data test;
a="00000100000100010000000001010001000000000100000000011110";output;
a="10000100000100010000000001010001000000000100011100011101";output;
a="01000100000100010000000001010001000000000100000001000000";output;
a="10100100000100010000000001010001000000000111111111111110";output;
a="01100100000100010000000001010001000000000101010101010101";output;
a="00000100000100010000000001010001000000000100001100101010";output;
run;

/* work by rows*/
%macro x;
%let i=1;
data test_output(drop=i);
 set test;
    i=1;
    %do %while (&i<=56);
        var&i.=0;
        var&i.=var&i.+input(substr(a,&i,1), best8.); 
        %let i=%eval(&i.+1);
    %end;
run;
%mend;
%x;

/* results:
a                                                          var1 var2 var3 var4 var5 var6 var7   .   .
00000100000100010000000001010001000000000100000000011110    0   0   0   0   0   1   0    .......    
10000100000100010000000001010001000000000100011100011101    1   0   0   0   0   1   0    .......    
01000100000100010000000001010001000000000100000001000000    0   1   0   0   0   1   0    .......    
10100100000100010000000001010001000000000111111111111110    1   0   1   0   0   1   0    .......    
01100100000100010000000001010001000000000101010101010101    0   1   1   0   0   1   0    .......    
00000100000100010000000001010001000000000100001100101010    0   0   0   0   0   1   0    .......    
*/

我认为作者正在尝试寻找一种do-loop方法。 所以我的建议是数据步骤中的宏%doarray语句。

data _null_;
    text = '000001000001000100000000010100010000000001';

    y = length(text);
    array Var[28];
    do i = 1 to dim(Var);
        Var[i] + (substrn(text,i*2,1)='1');
        put i = Var[i]=;
    end;
run;

有点容易,不是吗?

根据字符串排列可能增加的变量。 DO循环可以检查字符串的每个部分并有条件地应用所需的增量。

SUM语句<variable>+<expression>表示变量的值会自动逐行保留。

由于retain变量的性质,您可能只需要数据最后一行的最终var1-var28值。 该问题没有足够的信息来说明如何处理var<n>变量。

例子:

假定字符串被命名为op_string (操作为 op)。 利用逻辑评估结果True1 False0

data want(keep=var1-var28); 
  set have end=done;
  array var var1-var28;
  do index = 1 to 28;
    var(index) + substr(op_string, 2 * index) = '1';  * Add 0 or 1 according to logic eval;
  end;
  if done;  * output one row at the end of the data set;
run;

然后使用 COUNTC() 计算字符串中 1 的数量。

data want;
set have;
value = countc(op_string, '1');
run;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM