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.