1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
* Приводится пример макроса, который, принимает от пользователя список переменных и делит его на два списка после анализа файла данных. Один список переменных содержит числовые, другой - строковые переменные. Здесь макрос !num будет содержать числовые (numeric), макрос !str - строковые (string). 

* Размещено в списке рассылки SPSSX-L. Автор: rlevesque@videotron.ca 18.07.2001.

* Загрузим пример файла данных.
GET FILE='c:\\Program Files\\SPSSl\\employee data.sav'.

*//////////////////////.
DEFINE !VarType (!POS=!CMDEND)
SAVE OUTFILE='c:\\temp\\temp.sav'.
MATCH FILES FILE=* /KEEP=!1.
N OF CASES 1.

* Идея в том, чтобы приписать всем переменным числовое значение 1. Строковым переменным его приписать не удастся. Возникнут ошибки, а значения переменных останутся пустыми.
SET ERRORS=no.
DO REPEAT v=!1.
COMPUTE v=1.
END REPEAT.
SET ERRORS=yes.
FLIP.

IF MISSING(var001) var001=0.
SORT CASES BY var001.
MATCH FILES FILE=* /BY var001 /LAST=last.

DO IF $CASENUM=1.
WRITE OUTFILE="c:\\temp\\string vars.sps" /"DEFINE !str()".
WRITE OUTFILE="c:\\temp\\num vars.sps" /"DEFINE !num()".
END IF.

DO IF var001 = 0.
WRITE OUTFILE="c:\\temp\\string vars.sps" /" " case_lbl.
ELSE.
WRITE OUTFILE="c:\\temp\\num vars.sps" /" " case_lbl.
END IF.

DO IF last and var001=0.
WRITE OUTFILE="c:\\temp\\string vars.sps" /"!ENDDEFINE.".
ELSE IF last and var001=1.
WRITE OUTFILE="c:\\temp\\num vars.sps" /"!ENDDEFINE.".
END IF.
EXECUTE.

INCLUDE FILE="c:\\temp\\string vars.sps".
INCLUDE FILE="c:\\temp\\num vars.sps".
* Внимание: в конце работы макрос открывает не исходный файл, а временный, в который он сохранил данные перед началом работы с ними.
GET FILE='c:\\temp\\temp.sav'.
!ENDDEFINE.
*//////////////////////.

** Пример вызова макроса.

!VarType id TO jobcat.
* Приведём список строковых переменных.
LIST !str.

* Приведём список числовых переменных..
LIST !num.

***** Замечание:
	Если вы используете макросы  !str и !num внутри другого макроса, используйте выражения !EVAL(!str) и !EVAL(!num) для обращения к ним вместо обычных имён. При этом вместо !str и !num будет подставлен список переменных, которые содержатся в теле соответствующего макроса. Если !EVAL не использовать, !str или !num не будут расценены как вызовы соответствующего макроса.