SAS PROC SQL替换子字符串

时间:2018-02-21 15:45:03

标签: sas

我正在尝试使用PROC SQL更新字段。需要发生的是基于一个标准,二进制值字段需要改变第n个值。

示例:00100更新为00110。

我希望使用substr命令,但它没有按预期运行。

Data Test;
    Input Binary $;
    Datalines;
    000
    001
    010
    100
    ;
Run;

Proc SQL;
Select Case When substr(Binary,2,1) eq '0' Then Substr(Binary,2) = '1' End as Binary2
From Test;
Quit;

此查询仅返回字符串中的第二个字符,而不是更新,而不是返回更新的二进制变量。

2 个答案:

答案 0 :(得分:0)

SELECT不能以您使用它的方式使用左侧的SUBSTR。实际上,包括等号使得它与你的想法有很大的不同 - 它不会返回字符串的第二个字符,但它返回TRUE或FALSE。这恰好匹配第二个字符,因为你的字符是1或0而你正在测试它为1,但仍然。

Proc SQL;
Select Case When substr(Binary,2,1) eq '0' Then 
case when Substr(Binary,2) = '1' then return 1 else 0 end
End as Binary2
From Test;
Quit;

这就是SAS正在做的事情。

如果要在SQL中执行此操作,则必须构造子字符串,或者最好在数据步骤中执行此操作,以允许您使用left-hand-substr。

这可行,例如:

Proc SQL;
Select cats(substr(binary,1,1),'1',substr(binary,3)) as Binary2
From Test;
Quit;

答案 1 :(得分:0)

对于实际位标记的情况,使用来自按位族的函数

  • BOR (value, mask)打开位
  • BAND (value, BNOT (mask))关闭位
  • BXOR (value, mask)切换位

以下是一些演示使用这些按位函数的示例操作。使用diagnostic列观察发生采样操作的行以及操作前的原始值。

按位函数参数值范围为0..2 32 -1。当然,变量仍然是用于存储目的的双精度。

Data have;
  case_id + 1;
  Input
BitFlag binary3.; Datalines;
000
001
010
100
;
Run;

* extended sample data, every bit combination for 10 bits representing binary flag0-flag9;
data have;
  do bitflag = 0 to 2**10-1;
    output;
  end;
  stop;
  array diagnostic(10);
  format bitflag diag: binary10.;
run;

示例操作

proc sql;
  • 打开位5关闭的evey标志的第5位;
  update have
  set 
    bitflag = bor ( bitflag , 2**5 )
  , diagnostic1 = bitflag
  where
    band ( bitflag , 2**5 ) = 0
  ;
  • 关闭evey标志的第7位,其中bit-1关闭且bit-3打开;
  update have
  set 
    bitflag = band ( bitflag , bnot ( 2**7 ) )
  , diagnostic2 = bitflag
  where 
        band ( bitflag , 2**1 ) = 0
    and band ( bitflag , 2**3 ) > 0
  ;
  • 无条件打开第8位并无条件关闭第9位;
  update have
  set 
    bitflag = bor (
                band ( bitflag , bnot ( 2**9 ) ),
                2**8
              )
  , diagnostic3 = bitflag
  ;
  • 无条件地切换bit-0和bit-1;
  update have
  set 
    bitflag = bxor ( bitflag, bor (2**0 , 2**1 ) )
  , diagnostic4 = bitflag
  ;

注意:General SAS以#####x的形式理解十六进制文字,但没有理解位文字的语法。您可以使用此宏来使用文字位字符串的位字符解释进行编码。

  %macro BIT_LITERAL(bitstring);
    %sysfunc(inputn(&bitstring,binary32.));
  %mend;
  %put NOTE: %BIT_LITERAL(1);
  %put NOTE: %BIT_LITERAL(1001);
  ----- LOG -----
  NOTE: 1
  NOTE: 9

注意:DATA Step确实理解用于位测试的位掩码,但没有用于值赋值的位字法语法。

Proc DS2让SAS会话使用 具有二进制常量语法的DS2语言,以十六进制或二进制表示(x'hex-string'b'bit-string'