Объединение файлов, если они доступны в указанной папке

Я хочу объединить разные файлы SPSS в один новый файл. Я планирую использовать для этого команду MATCH в SPSS. См. Также еще один мой вопрос по этой теме (Объединение добавления наблюдений и добавления переменных путем объединения файлов в SPSS).

Однако количество файлов, которые я хочу объединить автоматически, не всегда одинаково. Это зависит от данных, которые запрашивал клиент. С другой стороны, каждый файл всегда будет использоваться в одной и той же команде MATCH.

Например, у нас есть 7 файлов с данными о здоровье. Когда клиент запросил все данные, все 7 файлов должны быть объединены в один новый файл. Однако, когда другой клиент запросил данные только из 3 файлов, только эти 3 файла следует объединить в один новый файл.

Мне интересно, знает ли кто-нибудь, как я могу этого добиться. Может быть, файлы должны быть помещены в определенную папку, чтобы существующие файлы можно было загрузить / сопоставить? Несуществующие файлы следует игнорировать. Может быть, что-то вроде «если-то»?

Спасибо заранее!


person Rolinde Alingh    schedule 04.05.2017    source источник


Ответы (2)


Вы можете сгенерировать и запустить команду MATCH FILES для всех файлов в папке или всех файлов, соответствующих подстановочному имени, с помощью нескольких строк кода Python. Вот пример, который объединяет все сохраненные файлы в определенной папке.

begin program.
import spss, glob

cmd = ["MATCH FILES"]

for f in glob.glob(r"c:/temp/*.sav"):
    cmd.append("""/FILE="%s" """ % f)
spss.Submit(cmd)
end program.
person JKP    schedule 06.05.2017
comment
При необходимости нужно будет добавить к команде любые модификаторы. - person JKP; 07.05.2017

Я бы сделал следующее. Возможно, это не самый эффективный способ, но он отлично работает ...

Я предполагаю, что у вас есть файл с записью для каждого клиента и 7 переменных, указывающих на необходимость каждого из файлов, например:

data list /ID 1-3 (A) FIL1 to FIL7 5-11.
begin data
001 1100101
002 0100110
003 0011111
004 1111111
end data.

Мне всегда нравится такой старомодный подход. Никаких макросов и никакого питона!

str matchcommand (a2000).
compu matchcommand eq "match files".
do rep a = FIL1 to FIL7
      /b = "C:\fil1.sav" "C:\fil2.sav" "C:\fil3.sav" "C:\fil4.sav" 
           "C:\fil5.sav" "C:\fil6.sav" "C:\fil7.sav". 
if a matchcommand eq concat(matchcommand, "\n  /file='", b, "'").
end rep.

compu matchcommand eq concat(matchcommand, " /by id.")

Строки в команде match можно записать в файл (ы) .sps с помощью команды write. Если вы добавите команду сохранения к этим частям синтаксиса, вы можете легко вызвать биты или файлы синтаксиса с помощью insert file.

Использование макросов или Python гораздо более гибкое, чем этот подход. Однако этот я всегда помню и могу быстро записать. Может, ржавый, но быстрый. Вот почему мне это так нравится.

person pm-b    schedule 04.05.2017