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
62
63
64
* Этот макрос будет полезен, если вам требуется изменить формат переменных... 
* со строкового на строковый (например, изменить длину) (ss),
* с числового на строковый (ns) или
* со строкового на числовой (sn)
* и при этом сохранить исходное имя и метку переменной.

* Автор: rlevesque@videotron.ca, 23.05.2001.

*/////////////////////.
DEFINE !convert (vname=!TOKENS(1)
               /nformat=!TOKENS(1)
               /type=!TOKENS(1))

/* здесь vname= имя переменной, формат которой изменяем */
/* nformat = новый формат */
/* type= тип преобразования: ss (со строки на строку), ns или sn, где n=числовой, s=строковый */

!IF (!type='ss') !THEN
STRING temp1234(!nformat).
COMPUTE temp1234=!vname.
!IFEND

!IF (!type='ns') !THEN
STRING temp1234(!nformat).
COMPUTE temp1234=LTRIM(STRING(!vname,F18.0)).
!IFEND

!IF (!type='sn') !THEN
COMPUTE temp1234=NUMBER(!vname,F18.0).
FORMAT temp1234(!nformat).
!IFEND
* Следующая команда сохраняет метку переменной. - А.Б.
* В случае преобразования типа команда выдаёт предупреждение о невозможности скопировать все
* свойства переменной одного типа на переменную другого типа, но метку приписывает без проблем.
APPLY DICTIONARY FROM=*
	/SOURCE VAR=!vname
	/TARGET VAR=temp1234.
MATCH FILES FILE=* /DROP=!vname.
RENAME VARIABLE (temp1234=!vname).
EXECUTE.
!ENDDEFINE.
*/////////////////////.


* ПРИМЕР: как использовать макрос.

* пример данных.
DATA LIST LIST /var1(A8), var2(A8), var3(F8.0).
BEGIN DATA
abcdefg	254	235
adadad	128	265
END DATA.
LIST.
VAR LABEL var1 'Переменная 1' /var2 'Переменная 2' /var3 'Переменная 3'.

!convert vname=var1  nformat=A5	type=ss.
*Этот вызов макроса укоротит строковую переменную var1 с 8 до 5 символов.

!convert vname=var2 nformat=F8.2 type=sn.
*Этот вызов конвертирует строковую переменную var2 в числовой формат F8.2.
* (Разумеется, если var2 содержит значение, которое не интерпретируется как число, результат будет пропуском).

!convert vname=var3  nformat=A8	type=ns.
*Этот вызов конвертирует числовую переменную var3 в строковый формат A8.