我正在尝试使用2个参数构建一个宏: - 调用宏时传递其中一个, - 第二个是第一个的转换。 基本上,我试图在第一个参数上进行字符串转换,并使用结果运行一些语法。
Define !MyMacro (arg1=!tokens (1), arg2=!DEFAULT(SomeValue) !tokens(1))
/*what I am trying to achieve is to
replace all "-" in arg1 with "_", but the syntax does not work with macro arguments:
compute !arg2 = replace(!arg1,"-","_").
/*I need arg 2 to be available further down the syntax, as a variable name:
fre !arg2.
!Enddefine.
有关解决此问题的任何建议吗?
答案 0 :(得分:1)
如果您查看Macro Directives (DEFINE-!ENDDEFINE command)文档,则会在String Manipulation部分中找到您需要进行此类替换的!SUBSTR
。
鉴于DEFINE /!ENDDEFINE中没有“REPLACE”字符串操作函数,您将不得不使用各种其他函数的组合,因此您可能也会发现此link有用,以执行算术运算
(为了这个目的,我已经停止使用SPSS MACRO语言进行编码,因为它非常非常难看,并且考虑到在SPSS中使用Python,我现在更喜欢在Python中编写代码,这将是非常微不足道的)。
答案 1 :(得分:1)
" - "作为一个特殊字符在宏解析器中将字符串分成separete标记。因此,您无法读取包含" - "的字符串。作为使用!TOKENS(1)的宏观参数(就像你在你的例子中所做的那样) 这可能会导致其他情况下的问题,但在这里我们可以将错误变成一个功能:下面的宏在!ARG1中运行单独的标记并替换" - "与" _"。如果没有" - ",那么!ARG1中只会有一个令牌,什么都不会改变。
Define !MyMacro (arg1=!cmdend)
!let !arg2=""
!do !i !in(!arg1)
!if (!i="-") !then !let !arg2=!concat(!arg2,"_") !else !let !arg2=!concat(!arg2,!i) !ifend
!doend.
title !quote( !arg2).
freq !arg2 .
!enddefine.
!MyMacro arg1=turn-into_.
以前的宏只适用于" - "和类似的特殊字符一样,下面的字符可以用于任何字符(虽然我仍然将它设置为" - "):
Define !MyMacro (arg1=!cmdend)
!let !arg2=""
!do !i = 1 !to !length(!arg1)
!if (!substr(!arg1,!i,1)="-") !then !let !arg2=!concat(!arg2,"_") !else !let !arg2=!concat(!arg2,!substr(!arg1,!i,1)) !ifend
!doend.
title !quote(!arg2).
freq !arg2 .
!enddefine.
!MyMacro arg1=turn-into_.