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
我有像“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