【发布时间】:2016-01-16 00:45:38
【问题描述】:
我正在尝试对保存到宏变量中的二进制数据执行操作。下面的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 格式的长度):
%let base64_string = %sysfunc(putc(%nrbquote(&str),$base64x244.));
【问题讨论】:
-
你试过
%superq(STR)吗? -
为什么不在数据步骤中使用
PUTC()函数?你为什么要使用宏变量? -
@Tom 这是一个函数风格的宏。