SAS Macro引用问题

时间:2016-01-16 00:45:38

标签: sas sas-macro

我正在尝试对保存到宏变量中的二进制数据执行操作。下面的datastep成功地将数据保存到宏变量中而没有任何问题:

data _null_;
  infile datalines truncover ;
  attrib x length=$300 informat=$300. format=$300.;
  input x $300.;
  put x=;
  call symput ('str',cats(x));
  datalines4;
‰PNG  >     IHDR   )   )   ëŠZ   sRGB ®Î=é   gAMA  ±^üa    pHYs  ;à  ;ÃÇo¨d   ZIDAT8OåŒ[ À½ÿ¥Ó¼”Ö5Dˆ_v@aw|+¸AnŠ‡;6<ÞóRÆÒÈeFõU/'“#f™Ù÷&É|&t"<ß}4¯à6†Ë-Œ_È(%<É'™èNß%)˜Î{-    IEND®B`‚
;;;;
run;

当我尝试以任何方式使用宏变量的内容时,保留字符的组合使其无法使用。以下保留字符在值中,并且不匹配:

&%'"()

我已经尝试了我能想到的宏引用功能的每一种组合,我甚至无法使用%put()获得打印的价值:

%put %nrbquote(&str);

结果:

SYMBOLGEN:  Macro variable STR resolves to ‰PNG  >     IHDR   )   )   ëŠZ   sRGB ®Î=é   gAMA
            ±^üa    pHYs  ;à  ;ÃÇo¨d   ZIDAT8OåŒ[
            À½ÿ¥Ó¼”Ö5Dˆ_v@aw|+¸AnŠ‡;6<ÞóRÆÒÈeFõU/'“#f™Ù÷&É|&t"<ß}4¯à6†Ë-Œ_È(%<É'™èNß%)˜Î{-
            IEND®B`‚
ERROR: The value É is not a valid SAS name.
ERROR: The SAS Macro Facility has encountered an I/O error.  Canceling submitted statements.

NOTE: The SAS System stopped processing due to receiving a CANCEL request.

最终,我想要做的是使用以下语句将这些值转换为base64编码(为了便于调试,我预先计算了base64格式的长度):< / p>

%let base64_string = %sysfunc(putc(%nrbquote(&str),$base64x244.));

1 个答案:

答案 0 :(得分:3)

您可以使用%SUPERQ()引用宏变量,而无需先对其进行扩展。请注意,它采用宏变量的名称而不是值作为其参数。

%let base64_string = %sysfunc(putc(%superq(str),$base64x244.));

但为什么不在数据步骤中进行转换并避免宏引用问题呢?