* Приводится пример макроса, который, принимает от пользователя список переменных и делит его на два списка после анализа файла данных. Один список переменных содержит числовые, другой - строковые переменные. Здесь макрос !num будет содержать числовые (numeric), макрос !str - строковые (string). * Размещено в списке рассылки SPSSX-L. Автор: rlevesque@videotron.ca 18.07.2001. * Загрузим пример файла данных. GET FILE='c:\\Program Files\\SPSSl\\employee data.sav'. *//////////////////////. DEFINE !VarType (!POS=!CMDEND) SAVE OUTFILE='c:\\temp\\temp.sav'. MATCH FILES FILE=* /KEEP=!1. N OF CASES 1. * Идея в том, чтобы приписать всем переменным числовое значение 1. Строковым переменным его приписать не удастся. Возникнут ошибки, а значения переменных останутся пустыми. SET ERRORS=no. DO REPEAT v=!1. COMPUTE v=1. END REPEAT. SET ERRORS=yes. FLIP. IF MISSING(var001) var001=0. SORT CASES BY var001. MATCH FILES FILE=* /BY var001 /LAST=last. DO IF $CASENUM=1. WRITE OUTFILE="c:\\temp\\string vars.sps" /"DEFINE !str()". WRITE OUTFILE="c:\\temp\\num vars.sps" /"DEFINE !num()". END IF. DO IF var001 = 0. WRITE OUTFILE="c:\\temp\\string vars.sps" /" " case_lbl. ELSE. WRITE OUTFILE="c:\\temp\\num vars.sps" /" " case_lbl. END IF. DO IF last and var001=0. WRITE OUTFILE="c:\\temp\\string vars.sps" /"!ENDDEFINE.". ELSE IF last and var001=1. WRITE OUTFILE="c:\\temp\\num vars.sps" /"!ENDDEFINE.". END IF. EXECUTE. INCLUDE FILE="c:\\temp\\string vars.sps". INCLUDE FILE="c:\\temp\\num vars.sps". * Внимание: в конце работы макрос открывает не исходный файл, а временный, в который он сохранил данные перед началом работы с ними. GET FILE='c:\\temp\\temp.sav'. !ENDDEFINE. *//////////////////////. ** Пример вызова макроса. !VarType id TO jobcat. * Приведём список строковых переменных. LIST !str. * Приведём список числовых переменных.. LIST !num. ***** Замечание: Если вы используете макросы !str и !num внутри другого макроса, используйте выражения !EVAL(!str) и !EVAL(!num) для обращения к ним вместо обычных имён. При этом вместо !str и !num будет подставлен список переменных, которые содержатся в теле соответствующего макроса. Если !EVAL не использовать, !str или !num не будут расценены как вызовы соответствующего макроса.