SPSS:在宏中使用 char.substr / 将字符串拆分为多个变量(宏)
SPSS: using char.substr in macro / Split String into multiple variables (macro)
我正在尝试编写一个宏来提取存储在变量中的字符串的定义部分。因为我打算在不同的变量上使用宏,所以我将我从中获取字符串的变量作为参数传递给我的宏。
我的问题是 char.substr()
在宏中不起作用并且 !SUBSTR
不会按预期工作,因为它不采用变量值的子字符串。相反,它采用变量名称的子字符串。
如果我将 VAR1 作为参数传递给我的宏,它会抛出错误,因为它将 VAR1 子集化为“VA”,然后尝试将(不存在的)变量“VA”的值分配给 OUT2。至少我猜这就是问题所在。
如果有人能帮助我,我将不胜感激:)
(我实际上想要实现的是编写一个宏函数,该函数根据分隔符将包含字符串的用户定义变量拆分为不同的变量。在这个宏中,我需要 !SUBSTR
函数。这就是为什么我按照我的方式选择我的例子。但是如果你知道我的实际问题的解决方案而不提供子字符串问题的解决方案,也欢迎你:D)
* DEFINE DATA.
DATA LIST /ID 1-3 VAR1 (A10).
BEGIN DATA
001 abc
002 defgh
003 ijkl
END DATA.
* NON-MACRO CODE (works).
STRING OUT1 (A10).
COMPUTE OUT1 = char.substr(VAR1, 1, 2).
EXECUTE.
* MACRO CODE (does not work).
DEFINE crt_substr (var = !TOKENS(1)).
STRING OUT2 (A10).
COMPUTE OUT2 = !SUBSTR(VAR1,1,2).
!ENDDEFINE.
crt_substr var=VAR1.
EXECUTE.
一方面,当您实际上想从数据中读取子字符串时,没有理由不在宏中使用 char.substr
(!substr
仅更改宏创建的语法).
因此在您的示例中 - 这工作正常(请注意对您的宏语法的一些更正):
DEFINE crt_substr (vr = !TOKENS(1)).
STRING OUT2 (A10).
COMPUTE OUT2 = char.SUBSTR(!vr,1,2).
!ENDDEFINE.
crt_substr vr=var1.
EXECUTE.
综上所述,您不一定需要宏来使用定界符拆分字符串 - 您可以在常规语法中使用 loop
,take a look here 是一个不错的教程。
This 是另一个使用宏的例子。
我正在尝试编写一个宏来提取存储在变量中的字符串的定义部分。因为我打算在不同的变量上使用宏,所以我将我从中获取字符串的变量作为参数传递给我的宏。
我的问题是 char.substr()
在宏中不起作用并且 !SUBSTR
不会按预期工作,因为它不采用变量值的子字符串。相反,它采用变量名称的子字符串。
如果我将 VAR1 作为参数传递给我的宏,它会抛出错误,因为它将 VAR1 子集化为“VA”,然后尝试将(不存在的)变量“VA”的值分配给 OUT2。至少我猜这就是问题所在。
如果有人能帮助我,我将不胜感激:)
(我实际上想要实现的是编写一个宏函数,该函数根据分隔符将包含字符串的用户定义变量拆分为不同的变量。在这个宏中,我需要 !SUBSTR
函数。这就是为什么我按照我的方式选择我的例子。但是如果你知道我的实际问题的解决方案而不提供子字符串问题的解决方案,也欢迎你:D)
* DEFINE DATA.
DATA LIST /ID 1-3 VAR1 (A10).
BEGIN DATA
001 abc
002 defgh
003 ijkl
END DATA.
* NON-MACRO CODE (works).
STRING OUT1 (A10).
COMPUTE OUT1 = char.substr(VAR1, 1, 2).
EXECUTE.
* MACRO CODE (does not work).
DEFINE crt_substr (var = !TOKENS(1)).
STRING OUT2 (A10).
COMPUTE OUT2 = !SUBSTR(VAR1,1,2).
!ENDDEFINE.
crt_substr var=VAR1.
EXECUTE.
一方面,当您实际上想从数据中读取子字符串时,没有理由不在宏中使用 char.substr
(!substr
仅更改宏创建的语法).
因此在您的示例中 - 这工作正常(请注意对您的宏语法的一些更正):
DEFINE crt_substr (vr = !TOKENS(1)).
STRING OUT2 (A10).
COMPUTE OUT2 = char.SUBSTR(!vr,1,2).
!ENDDEFINE.
crt_substr vr=var1.
EXECUTE.
综上所述,您不一定需要宏来使用定界符拆分字符串 - 您可以在常规语法中使用 loop
,take a look here 是一个不错的教程。
This 是另一个使用宏的例子。