簡體   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