Разбор строк, имеющих в себе символы возврата строки и перевода каретки
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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | *(Вопрос) В некоторых случаях строки содержат символы возврата строки и перевода * каретки. Длина строки, в таком случае, это общая длина двух или трёх строчек * текстового значения. * В редакторе данных SPSS программа отображает лишь значения до первого символа перевода * каретки. Но в поле ввода сверзу при засветке ячейки отображаются все символы. То есть, * информация не потеряна. Мне бы хотелось иметь возможность, например, заменить * символы перевода каретки на знаки "@" чтобы потом разбить информацию из переменной * по нескольким переменным. * Может ли SPSS осуществлять поиск по таким специальным символам?. *(Ответ) Точный ответ на этот вопрос был размещён в SPSSX-L 8.2.2002. Автор: Bjarte Aagnes. * Следующий (улучшенный синтаксис) был впоследствии направлен мне самим Bjarte. ************************************************************ Комментарии направлять : Bjarte Aagnes, aagnes@statinet.no ************************************************************ *Предварительный шаг 1: *прочтём пример данных с символами <cr><nl> = HEX 0d0a and HEX 41-6 = A-F. DATA LIST LIST /origin (AHEX30). BEGIN DATA 410d0a4243440d0a4546 46450d0a4443420d0a0d0a410d0a END DATA. EXE. *Предварительный шаг 2. /*форматируем как обычную текстовую строку с символами cr><nl>*/ FORMAT origin (A15). *Начало программы: изменяем формат строки на AHEX и записываем данные в файл. FORMAT origin (AHEX30). PRINT OUTFILE=tmp.txt /origin. EXE. ************************************************************ *Читаем из файла и разбираем. DATA LIST FILE = "tmp.txt" / origin (A15). DO IF (RINDEX(origin,"0D0A") > 0). + LOOP #j=1 TO 100. + STRING #str res (A30). + IF #j=1 #str=LTRIM(RTRIM(origin)). + COMP #p = INDEX(#str,"0D0A"). + COMP res = CON(RTRIM(res), SUB(#str,1,#p-1)). + COMP #str = SUB(#str,#p+4). + IF (RINDEX(#str,"0D0A")) = 0 res = CON(RTRIM(res),#str). + END LOOP IF RINDEX(#str,"0D0A") = 0. END IF. PRINT OUTFILE=tmp2.txt /origin res. EXE. *********************************************************** *читаем преобразованный вариант и конвертируем назад в привычный строковый формат (A15). DATA LIST LIST FILE = "tmp2.txt" / origin (AHEX30) res (AHEX30). FORMAT origin res (A15). EXE. LIST CASES /FORMAT=NUM. |