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
* Тема: Подстановка данных из предыдущих строк в пустые ячейки.
* Ключевые слова: пустые ячейки, LAG, восстановление неполных данных.
* Опубликован: 09.03.2008.
* Автор: rlevesque@videotron.ca.
* Перевод: А. Балабанов.
* Размещение: http://www.spsstools.ru/Syntax/WorkWithMissing/ReplaceBlanksByValueFromPreceedingCase.txt (.sps).

* Вопрос: данные в моем файле введены так, что пустые ячейки означают "те же данные, что и выше" ("то же самое"). 
	Можно ли поставить на место пустых ячеек действительные данные?

* Ответ: размещен в SPSSX-L 08.09.2001. Автор: rlevesque@videotron.ca.

* Примеч.: 
*	1. "Пустые" ячейки - это пропущенные значения в случае числовых переменных, а также - 
	ячейки, заполненные пробелами в случае строковых переменных. Представленное решение работает
	для любых комбинаций числовых и строковых переменных и при любом их числе. 
*	2. Разумеется, решение предполагает, что имеющиеся пустоты образовались лишь из-за того, что данные в них
	дублируют данные из предыдущих строк.

* Создадим пример данных для иллюстрации решения.
DATA LIST LIST /locat(F8.0) gender(A1) agegroup(F8.0) data1(F8.0) data2(F8.0).
BEGIN DATA
1 M 30 2 5 
.  " " 35 3 7
. F 30 3 3 
. " " 35 5 5
END DATA.
LIST. 

* Начало решения.
* Следующая строка - для подавления ненужных сообщений об ошибках, которые будут возникать при чередовании команд для
  обработки числовых и строковых переменных.
SET ERRORS=no.

DO REPEAT var=ALL.
* Следующая строка вызывает ошибку для строковых переменных, которую можно проигнорировать.
IF MISSING(var) var=LAG(var).
* Следующая строка вызывает ошибку для числовых переменных, которую можно проигнорировать.
IF LEN(LTRIM(var))=0 var=LAG(var).
END REPEAT PRINT.

* Восстанавливаем нормальный режим выдачи ошибок.
SET ERRORS=yes.

LIST.