SPSS:在宏中使用char.substr/将字符串拆分为多个变量宏

问题描述

我正在尝试编写一个宏来提取存储在变量中的字符串的定义部分。因为我打算在不同的变量上使用宏,所以我将从中获取字符串的变量作为参数传递给我的宏。 我的问题是 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,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 是使用宏执行此操作的另一个示例。