1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
* 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.
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
# -*- 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()
82
end program.