Этот код Python интегрирован в синтаксис SPSS.

Что он делает?

Он определяет, в какой папке находится текущий файл синтаксиса, делает эту папку рабочей, и начинает открывать все .sav-файлы в этой папке по очереди. Для каждого файла он выполняет команду DISPLAY DICTIONARY и сохраняет  ее выдачу на лист Dict в Excel-файл, расположенный в этой же папке.

Затем с помощью процедуры Custom Tables он строит частотные таблицы для всех переменных в файле и тоже выводит их в Excel, на лист Ctab. Затем файл данных закрывается и цикл повторяется.

NB! Существующий Excel-файл удаляется перед началом работы (по умолчанию это output.xlsx).
NB! Частотные таблицы строятся с помощью Custom Tables, если вы хотите оставить синтаксис как есть, вам нужен модуль Custom Tables.

Автор - Антон Митюшин, mitanton@yandex.ru.

1
2
3
4
5
6
7
8
* Encoding: UTF-8.

SET OVARS=BOTH ONUMBERS=BOTH TVARS=BOTH TNUMBERS=BOTH.
SET PRINTBACK ON.
SET UNICODE ON.
OUTPUT CLOSE ALL.

BEGIN PROGRAM Python3.
 9
10
11
12
13
14
15
16
17
18
19
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
import os
import spss, SpssClient

mask=".sav"
output_filename = "output"  # Укажите желаемое имя выходного Excel-файла

def Ctab ():
    """
    Данная функция строит синтаксис процедуры Custom Tables
    """
    
    nl="\n"
    tb=" "*4
    varsForProc = ""
    varsForTables = ""
    tblCat="[C][COUNT F40.0, UCOUNT F40.0, COLPCT.COUNT PCT40.1, COLPCT.VALIDN  PCT40.1]+"
    for i in range(spss.GetVariableCount()):
        varsForProc+=(tb*3)+spss.GetVariableName(i)+nl
        varsForTables+=(tb*3)+spss.GetVariableName(i)+tblCat+nl
    varsForTables=varsForTables.replace(nl+tblCat+nl,nl+"")
    varsForTables=varsForTables[:len(varsForTables)-2]
    ct="CTABLES" + nl + \
        "/TABLE" + nl + \
        varsForTables + nl + \
        "/CATEGORIES VARIABLES=" + nl + \
        varsForProc  + nl + \
        "[OTHERNM, MISSING] EMPTY=INCLUDE TOTAL=YES POSITION=AFTER."
    return ct

def treatFolder (path, ext, func):
    """
    Данная функция перебирает все  .sav-файлы в папке и для каждого вызывает функцию с синтаксисом.
    
    Обратите внимание, функция с синтаксисом SpssCmd передается сюда как параметр.    
    """
    
    files = sorted(os.listdir(path))
    for file in files:
        if file.endswith(ext): func(file)

def SpssCmd(file):
    """
    Эта функция управляет содержанием и порядком выполнения синтаксиса для каждого файла данных.
    
    В ней также используется фрагмент синтаксиса, возвращаемый процедурой Ctab.
    """
    
    spss.Submit("GET FILE = '" + file + "'.")      
    spss.Submit("OUTPUT NEW NAME=Dict.") 
    spss.Submit("DISPLAY DICTIONARY.")
    spss.Submit("OUTPUT EXPORT /XLSX  DOCUMENTFILE='%s.xlsx' OPERATION=MODIFYSHEET SHEET='Dict'." % output_filename)
    spss.Submit("OUTPUT CLOSE *.")    
    spss.Submit("OUTPUT NEW NAME=Ctab.") 
    spss.Submit(Ctab())
    spss.Submit("OUTPUT EXPORT /XLSX  DOCUMENTFILE='%s.xlsx' OPERATION=MODIFYSHEET SHEET='Ctab' LOCATION=LASTROW." % output_filename)
    spss.Submit("OUTPUT CLOSE *.")
    spss.Submit("DATASET CLOSE *.")


# Выше мы просто определили нужные функции. Непосредственно они начинают выполняться здесь.
SpssClient.StartClient()
sDoc = SpssClient.GetDesignatedSyntaxDoc()
filePath=sDoc.GetDocumentPath()  # Тут получаем папку, где располагается текущий файл синтаксиса
spss.Submit("CD '"+filePath+"'.")  # ... делаем эту папку рабочей
spss.Submit("HOST COMMAND = 'DEL %s.xlsx'." % output_filename)  # Удаляем Excel-файл, если он существует
path=os.path.dirname(filePath)
treatFolder(path, mask, SpssCmd)
SpssClient.StopClient()
77
END PROGRAM.