【问题标题】:SAS Macro quoting issuesSAS 宏引用问题
【发布时间】: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 这是一个函数风格的宏。

标签: sas sas-macro


【解决方案1】:

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

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

但为什么不直接在 DATA STEP 中进行转换并避免宏引用问题呢?

【讨论】:

  • 我正在使用函数式宏中的fget() 从文件中读取值,所以很遗憾我没有该选项。
  • 确保用空格填充字符串到 3 个字节的倍数。我之前看到过一个问题,当给定最后一个块少于 3 个字符的字符串时,base64 转换不会生成完全正确的值。
  • 感谢您的提醒。我也试过superq(),但忘记了它需要一个变量名而不是一个值......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多