Чтение файла, где каждое наблюдение имеет 4 числовые записи и неопределённое число строковых
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). |
Related pages
...