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
*(Вопрос) Я пытаюсь прочитать ASCII-файл, содержащий для каждого наблюдения
от 4 до 11 записей. Первые 4 записи содержат ответы на закрытые вопросы, 
а следующие 7 записей (если они есть), содержат текстовые строки 
(ответы с вариантом "другое"). Хотя число записей на одно наблюдение может
варьироваться, каждая запись содержит в начале идентификатор наблюдения
(примерно так, как показано)....

0000001 1 2 3 12 13 12
0000001 2 2 3 09 08 01
0000001 1 1 2 06 14 22
0000001 1 4 7 09
0000002 1 2 3 01 10 11
0000002 3 1 2 01 09 02
0000002 1 1 3 07 15 20
0000002 1 2 1 12
0000002 текст1
0000002 текст
0000002 текст3
0000002 текст4

*(Ответ) Размещён в SPSSX-L 6.11.2001, автор: rlevesque@videotron.ca.
* http://www.spsstools.net.


NEW FILE.
INPUT PROGRAM.
STRING mytext(A40).
* читаем строку данных в предположении, что она не содержит текста.
DATA LIST LIST /id ans1 TO ans6.

DO IF MISSING(ans1) & (id=LAG(id)).
* Уп-с, наткнулись на текст. Перечитываем эту строчку данных особым порядком.
REREAD.
DATA LIST LIST /id mytext.
END IF.

END CASE.
END INPUT PROGRAM.

BEGIN DATA
0000001 1 2 3 12 13 12
0000001 2 2 3 09 08 01
0000001 1 1 2 06 14 22
0000001 1 4 7 09
0000002 1 2 3 01 10 11
0000002 3 1 2 01 09 02
0000002 1 1 3 07 15 20
0000002 1 2 1 12
0000002 текст1
0000002 текст2
0000002 текст3
0000002 текст4
END DATA.


LIST.
COMPUTE casenb=$CASENUM.
RANK  VARIABLES=casenb BY id  /RANK INTO recno.

VECTOR text(4A40) /ans=ans1 TO ans6 /answ(24F8.0).
DO IF recno<5.
LOOP cnt=1 TO 6.
COMPUTE #idx=cnt + (recno-1) * 6.
COMPUTE answ(#idx)=ans(cnt).
END LOOP.
ELSE.
COMPUTE text(recno - 4)=mytext.
END IF.
EXECUTE.

AGGREGATE
  /OUTFILE=*
  /BREAK=id
  /answ1 TO answ22= FIRST(answ1 TO answ22) /text1 TO text4 = MAX(text1 TO text4).