Как поместить структуру BEGIN PROGRAM-END PROGRAM в макрос? - PullRequest
0 голосов
/ 04 апреля 2020

Я написал Python скрипт для SPSS, который мне нужно использовать пару раз в синтаксисе. Таким образом, я хотел бы избежать повторения структуры BEGIN PROGRAM-END PROGRAM. более одного раза. Я решил поместить его в макрос, но, к сожалению, он не работает, хотя в макросе и в скрипте нет ошибок. Код:

define mac_export (!positional !tokens(1))

  OUTPUT EXPORT
  /CONTENTS EXPORT = visible  LAYERS = printsetting  
  MODELVIEWS = printsetting
  /XLSX  DOCUMENTFILE = "tables1.xlsx"
  OPERATION = createsheet
  sheet = !quote(!unquote(!1))
  LOCATION = lastcolumn NOTESCAPTIONS = no

!enddefine.

define clean ()

begin program.
import spss, SpssClient

SpssClient.StartClient()

OutputDoc = SpssClient.GetDesignatedOutputDoc()

OutputDoc.SelectAllText()
OutputDoc.Delete()

OutputDoc.SelectAllLogs()
OutputDoc.Delete()

OutputDoc.SelectAllNotes()
OutputDoc.Delete()

OutputDoc.SelectAllTitles()
OutputDoc.Delete()

OutputDoc.SelectAllWarnings()
OutputDoc.Delete()
end program.

!enddefine.

*** REPORT.
ctables
  /table
  (att1 + att2 + att3)
  [s][mean f1.1]
  /slabels position = column visible = no
  /titles title = "Attitudes".

clean.
mac_export "Attitudes".

ctables
  /mrsets countduplicates = no
  /table gender > $STATEMENTS [colpct.responses.count f40.0] by age
  /slabels position = column
  /titles title = "Statements".

clean.
mac_export "Statements".

* AND OTHER TABLES...

Когда я запускаю этот код, SPSS останавливается при первом вызове макроса clean. Что я могу сделать, чтобы упростить мой код и избежать повторения структуры BEGIN PROGRAM?

1 Ответ

0 голосов
/ 04 апреля 2020

Прежде всего, в нижней части описания DEFINE-!ENDDEFINE. прямо сказано, что коды скриптов нельзя помещать в макрос: https://www.ibm.com/support/knowledgecenter/pl/SSLVMB_25.0.0/statistics_reference_project_ddita/spss/base/syn_define_overview.html. Во-вторых, вы можете использовать команду SCRIPT для запуска скрипта из внешнего файла. Вы также можете разместить эту команду внутри макроса. Относительно структуры BEGIN PROGRAM существует интересный обходной путь:

  1. Сначала необходимо скопировать код Python с предложением BEGIN PROGRAM-END PROGRAM в другой новый файл синтаксиса . Предположим, этот файл называется Python_cleaning.sps.
  2. Во-вторых, вам нужно заменить структуру BEGIN PROGRAM внутри макроса clean на простую строку INSERT. Эта команда позволяет запускать внешний синтаксис из другого. Код:
define clean ()

insert file = "C:\path\Python_cleaning.sps" 
syntax = interactive error = stop cd = no encoding = "utf8".

!enddefine.
Наконец, вы можете запустить скрипт Python в своем синтаксисе, используя макрос clean.
...