* Требуется разбросать значения из текстовой переменной, разделённой запятыми,
* по разным переменным, а затем закодировать значения.
DATA LIST FIXED /caseid 1-2 (F) a 3-255 (A).
BEGIN DATA
01spain, russia, canada, soviet union
02Spain,USA, France,CANADA
03
04UK,Germany,Russia, Mexico,France,canada
END DATA.
* NB! Возникнут проблемы, если название страны имеет более 17 символов, или присутствует
* более 15 стран. Потребуется корректировка синтаксиса.
set mprint=no.
STRING #delim(A1) #tmp(A255) c1 TO c15 (A17).
VECTOR c=c1 TO c15.
COMPUTE #delim=",".
COMPUTE #tmp=CONCAT(RTRIM(a),#delim).
COMPUTE cnt=1.
LOOP IF INDEX(#tmp,#delim)>1.
COMPUTE c(cnt)=LOWER(LTRIM(SUBSTR(#tmp,1,INDEX(#tmp,#delim)-1))).
COMPUTE cnt=cnt + 1.
COMPUTE #tmp=SUBSTR(#tmp,INDEX(#tmp,#delim)+1).
END LOOP.
*////////////////.
DEFINE !apply (id=!TOKENS(1) /stem=!TOKENS(1) /nb=!TOKENS(1) /fmt=!TOKENS(1))
SAVE OUTFILE='c:\\temp\\original data.sav'.
STRING s(!fmt).
VECTOR sv=!CONCAT(!stem,'1') TO !CONCAT(!stem,!nb).
LOOP cnt=1 TO !nb.
COMPUTE s=sv(cnt).
XSAVE OUTFILE='c:\\temp\\data1.sav' /KEEP=!id cnt s.
END LOOP.
EXECUTE.
GET FILE='c:\\temp\\data1.sav'.
SELECT IF RTRIM(s)<>"".
AUTORECODE s /INTO srec.
N OF CASES 1.
SAVE OUTFILE='c:\\temp\\label definitions.sav'.
GET FILE='c:\\temp\\data1.sav'.
SELECT IF RTRIM(s)<>"".
SORT CASES BY s.
AGGREGATE
/OUTFILE=*
/BREAK=s
/!id = N(!id).
COMPUTE recnb=$CASENUM.
SAVE OUTFILE='c:\\temp\\data2.sav'.
GET FILE='c:\\temp\\data1.sav'.
SORT CASES BY s.
MATCH FILES FILE=*
/TABLE='c:\\temp\\data2.sav'
/BY=s.
SORT CASES BY !id cnt.
VECTOR !stem (!nb F1).
COMPUTE !stem(cnt)=recnb.
AGGREGATE
/OUTFILE=*
/BREAK=!id
/!CONCAT(!stem,'1') TO !CONCAT(!stem,!nb) =
FIRST(!CONCAT(!stem,'1') TO !CONCAT(!stem,!nb)).
!DO !cnt=1 !TO !nb
RENAME VARIABLE (!CONCAT(!stem,!cnt)=srec).
APPLY DICTIONARY FROM='c:\\temp\\label definitions.sav'.
RENAME VARIABLE (srec=!CONCAT(!stem,!cnt)).
!DOEND
!ENDDEFINE.
*////////////////.
SET MPRINT=yes.
* в вызове макроса мы указываем на необходимость единообразной перекодировки переменных
c1-c15 из единого текстового формата a15 в числовой с метками значений. Идентификатор наблюдения - переменная caseid.
!apply id=caseid stem=c nb=15 fmt=a15.
SET MPRINT=no.