* Python-альтернатива для этого скрипта: http://www.spsstools.net/Scripts/OutputDoc/ReplaceLeftPanePageTitleByContentOfRightPaneTitle.sbs. * Скрип должен применяться к сформированному Output, где присутствуют заголовки страниц. * Они могут быть вставлены, например, как Insert...New Page Title или командой TITLE синтаксиса. * После выполнения этого скрипта отображение этих заголовков в панели навигации слева будет заменено на фактическое содержание этих заголовков. * Для использования скрипт можно привязать к пользовательской кнопке в меню. Его также моно вставлять в конец (длинного набора) синтаксисов командой INSERT. * Таким образом будет гораздо проще ориентироваться в длинном файле вывода!. *** Данное определение и вызов макроса нужны просто для того, чтобы сформировать несколько заголовков страниц для примера. define !demo () !do !year = 1999 !to 2015 title !quote(!concat("** Год: ", !year)). !doend. !enddefine. !demo. *** А это - непосредственно скрипт. begin program. # -*- coding: utf-8 -*- ############################################################################### # Название: Заменить 'Page Title' из команды TITLE SPSS фактическим содержанием заголовка. # Автор: Albert-Jan Roskam # Дата: 2014-01-21 # Примеч.: Функция скрипта чисто косметическая, но это упрощает чтение файла вывода. ############################################################################### import tempfile, os, sys, io import spss, SpssClient def _get_encoding(): """Возвращает кодировку файла синтаксиса (utf-8 если режим unicode, ansi если режим codepage (e.g. 1252)""" spsslocale, utf8mode = map(spss.GetSetting, ["locale", "unicode"]) codepage = spsslocale.split(".")[-1] return "utf-8" if utf8mode == "Yes" else codepage def _titleToPane(): """Вызывается из titleToPane(). Это функция делает непосредственно работу""" outputDoc = SpssClient.GetDesignatedOutputDoc() outputItemList = outputDoc.GetOutputItems() textFormat = SpssClient.DocExportFormat.SpssFormatText filename = tempfile.mktemp() + ".txt" for index in range(outputItemList.Size()): outputItem = outputItemList.GetItemAt(index) if outputItem.GetDescription() == u"Page Title": #Это надо поменять, если вы работаете с локализованным Output. #Например, для локализации русского языка: #if outputItem.GetDescription() == u"Заголовок страницы": outputItem.ExportToDocument(filename, textFormat) with io.open(filename, encoding=_get_encoding()) as f: # увы, приходится работать с промежуточным файлом outputItem.SetDescription(f.read().rstrip()) os.remove(filename) return outputDoc def titleToPane(spv=None): """Копируем содержанием команды TITLE активного окна Output в панель навигации слева. Данный скрипт может вызывать и извне SPSS. Поэтому предусмотрена передача аргумента пути к .spv-документу, который следует обработать. Если этот аргумент не передан, обрабатывается текущий файл вывода. """ try: outputDoc = None SpssClient.StartClient() if spv: SpssClient.OpenOutputDoc(spv) outputDoc = _titleToPane() if spv and outputDoc: outputDoc.SaveAs(spv) except: print "ОШИБКА заполнения TITLE в окне Output Viewer [%s]" % sys.exc_info()[1] finally: try: SpssClient.Exit() except WindowsError: pass SpssClient.StopClient() if __name__ == "__main__": titleToPane() end program.