char值里面的计算

calculation inside char value

我有像“some text {5+1.5}”这样的字符串值,我想在数据步骤中计算它。 (此值来自列,但无关紧要)。

我有代码,执行正确但宏内部有错误。但是如果没有宏执行它,就没有错误。我想在宏中执行它,我该如何修复错误?不使用 options NOERRORABEND NODMSSYNCHK NOSYNTAXCHECK;。算法是使用 tranwrd "{" 更改为 "%sysevalf(""}" 更改为 ")".

代码工作正常,但日志中有错误:

%macro t;
data have_in_macro;
%let value=%sysfunc(tranwrd(
                          %sysfunc(tranwrd(
                                        "some text {5+1.5}",%str(}),%str(%))
                              )),%str({),%str(sysevalf)%str(%()
                ));

                %let value=%sysfunc(tranwrd(
                            %str(&value),%str(sysevalf),%str(%%)%str(sysevalf)
                ));
                t=&value;
run;
%mend t;

%t;

无需使用宏即可正确运行的代码:

data have;
%let value=%sysfunc(tranwrd(
                          %sysfunc(tranwrd(
                                        "some text {5+1.5}",%str(}),%str(%))
                              )),%str({),%str(sysevalf)%str(%()
                ));

                %let value=%sysfunc(tranwrd(
                            %str(&value),%str(sysevalf),%str(%%)%str(sysevalf)
                ));
                t=&value;
run;

输入:

some text {5+1.5}

输出:

some text 6.5

使用宏时出错:

ERROR: %SYSEVALF must be followed by an expression enclosed in parentheses.

P.S。这段代码只是调用错误的示例,我使用我的算法调用 tranwrd.

如果您使用的是 data _null_ 步骤,则可以使用数据步骤函数,而不是宏函数。

这对我有用 - 没有错误。

我把它分成两行,第一行将 { 替换为 %sysevalf(,将 } 替换为 )

编辑:使用 RESOLVE() 评估字符串。

data have;
yourStringVariable = "some text {5+1.5}";
run;
    
  %macro t(input_dsn= , output_dsn = );  
    data &output_dsn.;
    set &input_dsn.;
     *replace {;
     text_string2 = tranwrd(yourStringVariable, '{', '%sysevalf(');
     *replace };
     text_string3 = resolve(tranwrd(text_string2, '}', ')'));

    run;
    
%mend t;

%t(input_dsn=have, output_dsn=want);;

proc print data=want;
run;

你的 tranwrd 宏调用过于复杂,你用 sysevalf 引入的 % 是在之后而不是之前。

代码示例(在下方)有一个更简单的表达式来解析硬编码

"some text {5+1.5}"

进入内部中间体

"some text %sysevalf(5+1.5)"

在最外层的上下文中 %sysfunc。因为最外层是 %SYSFUNC,而不是 %QSYSFUNC,宏系统将隐含地进一步将中间值解析为符号 value 的最终宏赋值,如

 "some text 6.5"

示例代码:

%macro t;
data have_in_macro;

    %let value = %sysfunc(tranwrd(
                          %sysfunc(tranwrd(
                                          "some text {5+1.5}",
                                          },
                                          %str(%))
                                          )
                          ),
                          {,
                          %nrstr(%sysevalf%()
                ));

%put NOTE: (MACRO &sysmacroname.) value=%superq(value);

                t=&value;
run;
%mend t;

%t

ods listing;

proc print data=have_in_macro;
run;

日志

308  %t
NOTE: (MACRO T) value="some text 6.5"

NOTE: The data set WORK.HAVE_IN_MACRO has 1 observations and 1 variables.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.01 seconds

输出

The SAS System

Obs          t

 1     some text 6.5