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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Решение SPSS AnswerNet

Код решения:	 	100000572	
ПО:		 	SPSS Base 	

Тема:
Запись файла ASCII с отображением пропущенных значений точками. 

Описание:
Вопрос. 
Мне требуется экспортировать данные в ASCII-файл, записав туда
пропущенные значения как точки. Я пытаюсь использовать команду WRITE,
но всегда получаю пробелы вместо точек. И когда я пытаюсь читать эти 
данные другой программой, возникают ошибки. Ещё мне бы надо создать
ASCII-файл, куда записать имена всех переменных из SPSS.

Ответ. 
Во-первых, проверьте, не может ли другое приложение импортировать
табулированные файлы, где встречаются пробелы. Если может, задача 
упрощается: можно использовать следующий код

* ДОПУСТИМ, ЧТО ФАЙЛ ДАННЫХ ОТКРЫТ, АКТИВЕН, А ВСЕ ПЕРЕМЕННЫЕ ЯВЛЯЮТСЯ ЧИСЛОВЫМИ *. 
* Сделаем резервную копию файла данных * . 
SAVE OUTFILE 'TMP.SAV'. 
* Заменим все пропуски, определённые пользователем на системные пропуски SYSMIS *. 
RECODE ALL (MISSING=SYSMIS). 
SAVE TRANSLATE OUTFILE 'c:\\temp\\ddd.txt'/TYPE=TAB /REPLACE. 
SELECT IF $CASENUM=1. 
FLIP . 
WRITE OUTFILE 'SPSS.TI' / CASE_LBL. 
EXECUTE. 
GET FILE 'TMP.SAV'. 

В случае, если другое приложение не принимает табулированные файлы,
задача чуть более сложна, но разрешима. Идея - конвертировать все 
переменные в строки, а затем заменить пустые строки точками перед
экспортом данных. Простейший способ, известный мне - это использовать
SPSS для записи синтаксиса, осуществляющего преобразования, а затем - 
использовать сам синтаксис для выполнения преобразований. Суть формируемого
синтаксиса - создать (командой COMPUTE) строковые переменные из числовых, 
затем убрать исходные переменные и дать строковым переменным имена
исходных. Можно также применить строковый шаблон, а затем - экспортировать
данные в текстовый файл (после замены пробелов на точки).

* Резервируем исходные данные * . 
SAVE OUTFILE 'TMP.SAV'. 
* Получаем файл с именами переменных * . 
SELECT IF $CASENUM=1. 
FLIP. 
COMPUTE =1. 
COMPUTE ID=$CASENUM. 
STRING NEW (A8). 
COMPUTE NEW=CONCAT('VAR',STRING(ID,N5)). 
* Tag first and last variables for special processing *. 
MATCH FILES FILE * / LAST= BOT /FIRST=TOP / BY . 
* Generate a set of compute statements to change numerics to strings *. 
WRITE OUTFILE 'MCR0.TMP'/'STRING ',NEW, '(A8)'/ 'COMPUTE 
',NEW,'=STRING(',CASE_LBL,',F8.4)' . 
* Generate a DROP statement *. 
DO IF TOP. 
WRITE OUTFILE 'MCR1.TMP' / 'MATCH FILES / FILE=* /DROP'. 
END IF. 
WRITE OUTFILE 'MCR1.TMP' /' ',CASE_LBL. 
* Generate a rename statement *. 
WRITE OUTFILE 'MCR2.TMP'/ 'RENAME VARIABLES ('NEW,'=',CASE_LBL,')'. 
* Generate file with variable names file *. 
WRITE OUTFILE 'SPSS.TI' / CASE_LBL. 
DO IF BOT. 
WRITE OUTFILE 'MCR2.TMP' 
/"WRITE OUTFILE 'SPSS.DA'/ALL (",ID (F3.0),'(A8,X))'. 
END IF. 
EXECUTE. 
GET FILE 'TMP.SAV'. 
RECODE ALL (MISSING=SYSMIS). 
INCLUDE 'MCR0.TMP'. 
INCLUDE 'MCR1.TMP'. 
RECODE ALL (' '='.'). 
INCLUDE 'MCR2.TMP'. 
EXECUTE. 
GET FILE 'TMP.SAV'. 
ERASE FILE 'MCR0.TMP'. 
ERASE FILE 'MCR1.TMP'. 
ERASE FILE 'MCR2.TMP'.