1
 2
 3
 4
 5
 6
 7
 8
 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
* Это файл "Process all xls files in folder part 2.SPS" 

* Перед запуском этого файла должен быть запущен скрипт "Process all xls files in folder part 1.SBS".
* Автор: rlevesque@videotron.ca.

*/////////////////////////////.
SET MPRINT=no.
* Исправьте следующий путь на путь к той папке, где должны быть сохранены файлы sav после обработки.
DEFINE !outdir()'c:\\temp\\'
!ENDDEFINE.


* Следующий макрос предназначен для выполнения некоторых нужных пользователю операций
  с файлом xls перед тем, как он будет сохранён в файл sav. Макрос вызывается в конце 
  этого файла.
  
*//////////////////.
DEFINE !psf2 (fnumb=!TOKENS(1) /fname=!CMDEND )
!LET !infile =!QUOTE(!CONCAT(!UNQUOTE(!EVAL(!indir)),!fname))

/* Следующая команда предполагает исполнение синтаксиса на версии SPSS 10.0 и выше */.
/* Исправьте название листа Excel на то, которое есть у вас на самом деле */.
GET DATA
  /TYPE=XLS
  /FILE=!infile
  /CELLRANGE=full
  /READNAMES=on .
*  Если вам нужно импортировать данные не с первого, а с определённого листа файла xls, можно явно указать
* это в подкоманде /SHEET=name 'имя_листа'. При этом листы с указанным именем должны находиться во всех
* обрабатываемых файлах - А.Б.
/*************************************************************/.
/* Вставьте сюда любой нужный вам набор команд обработки     */.
/*************************************************************/.

/* Следующая строка подразумевает, что имя файла sav будет таким же, */
/*	как и имя соответствующего файла xls. Если вы предпочитаете имена */
/*	с последовательной нумерацией, измените параметр !fname ниже на !fnumb */

!LET !outfile=!QUOTE(!CONCAT(!UNQUOTE(!EVAL(!outdir)),!fname,'.sav'))
SAVE OUTFILE=!outfile.

!ENDDEFINE.
*/////////////////////////////.


* Читаем все имена файлов xls.
*================================================================================================.
* Этот блок исправлен. Элегантный вариант получения списка файлов в скрипте через командную
* строку не всегда хорошо работает с длинными именами файлов и именами с нелатинскими символами.
* Предложен более надёжный в данном случае вариант формирования списка.
* Соответственно исправлен блок команд в файле синтаксиса - А.Б.
* FILE TYPE MIXED FILE=!indir + "list.txt" RECORD=REC_ID 10-12 (A).
* RECORD TYPE 'XLS'.
* DATA LIST FIXED  / fname 1-8(A).
* END FILE TYPE.
DATA LIST FILE=!indir+"list.txt" /fname 1-256 (A).

*================================================================================================.
LIST.

* Записываем синтаксис, который вызовет определённый выше макрос с каждым из файлов xls.
COMPUTE fnumb=$CASENUM.
FORMATS fnumb (F8.0).
WRITE OUTFILE=!indir + "macro calls.sps"  /"!psf2 fnumb=" fnumb " fname=" fname.
EXECUTE.

* Следующая команда заставляет отображать в окне результатов команды синтаксиса, 
  которые сгенерировал макрос.
SET MPRINT=yes.
* Теперь запускаем только что созданный синтаксис.
INCLUDE FILE=!indir + "macro calls.sps".