ВОПРОС:
Я новичок в GNU Make. Есть ли лучший способ программно преобразовать наборы статистических данных из sas7bdat в файлы csv и синхронизировать их друг с другом с помощью GNU Make для содействия воспроизводимым исследованиям? Подойдете ли вы к этой проблеме иначе с точки зрения кодирования, или есть лучший способ продвигать воспроизводимые исследования? Могу ли я добавить дополнительное условие (например, statTransferOptions.txt
) при использовании правил статического шаблона?
Решение должно:
- Найдите все файлы sas7bdat во всех подкаталогах
- Читать статистикуПараметры передачи
- Преобразуйте файл sas7bdat в файл csv с помощью инструмента командной строки statTransfer с параметрами.
- Given the current limitations of statTransfer, I think this will require a two step process:
- Build statTransfer command file (.stcmd) for each SAS data file (.sas7bdat)
- Создайте файл csv для каждого файла stcmd, выполнив statTransfer (st) с использованием параметров в файле stcmd
- целевые файлы stcmd и csv должны находиться в том же подкаталоге, что и необходимый файл sas7bdat
- Найдите устаревшие файлы stcmd и csv и обновите их, если существует новый файл sas7bdat или если файл базовых опций изменяется.
КОНТЕКСТ:
Мне в наследство достался большой статистический отчет, который публикуется ежегодно. В предыдущие годы анализ проводился в SAS. Теперь мы используем R. Некоторые из файлов sas7bdat, сгенерированных SAS Enterprise Guide, некорректно импортируются с пакет sas7bdat. StatTransfer, коммерческий продукт, имеет интерфейс командной строки и правильно конвертирует файлы sas7bdat в файлы csv; однако есть параметры, улучшающие преобразование (например, запись форматов даты). Файлы sas7bdat находятся в нескольких подкаталогах, соответствующих типу набора данных и году.
К такому подходу подтолкнули:
Гандруд, Кристофер (21.06.2013). Воспроизводимое исследование с помощью R и RStudio (Chapman & Hall / CRC The R Series) (стр. 104-105). Чепмен и Холл / CRC. Kindle Edition.
ИСПРАВЛЕНИЕ ПРОБЛЕМ:
- Это почти делает то, что я хочу: Рекурсивные подстановочные знаки в GNU make?
ПРЕДЛАГАЕМЫЙ МАКЕФИЛЬ?
RDIR := .
######
#PREP#
######
# Use BASH shell to create list of source sas7bdat files
SASDATA = $(shell find $(RDIR) -type f -name '*.sas7bdat')
# Use pattern substring functions to define variable list of filenames
# to be used as targets in recipes
STCMD_OUT = $(patsubst $(RDIR)/%.sas7bdat, $(RDIR)/%.stcmd, $(SASDATA))
CSV_OUT = $(patsubst $(RDIR)/%.sas7bdat, $(RDIR)/%.csv, $(SASDATA))
#########
#TARGETS#
#########
all: $(STCMD_OUT) $(CSV_OUT)
# I think the name "static pattern rules" is misleading
# but I found this to be helpful:
# http://www.gnu.org/software/make/manual/make.html#Static-Pattern
# can I add statTransferOptions.txt as a pre-requisite while using static pattern rules?
$(STCMD_OUT): $(RDIR)/$(@D)/%.stcmd: $(RDIR)/$(@D)/%.sas7bdat
cp $(RDIR)/statTransferOptions.txt $@
echo copy $(RDIR)/$< delim $(RDIR)/$(basename $<).csv -v >> $@
echo quit >> $@
$(CSV_OUT): $(RDIR)/$(@D)/%.csv: $(RDIR)/$(@D)/%.stcmd
st $(RDIR)/$<
clean:
rm $(STCMD_OUT)
rm $(CSV_OUT)
ПЕРЕСМОТРЕННЫЙ МАКЕФАЙЛ ПОСЛЕ ВВОДА ОТ:
RDIR := .
######
#PREP#
######
# Create list of source sas7bdat files
SASDATA := $(shell find $(RDIR) -type f -name '*.sas7bdat')
STCMD_OUT := $(patsubst $(RDIR)/%.sas7bdat, $(RDIR)/%.stcmd, $(SASDATA))
CSV_OUT := $(patsubst $(RDIR)/%.sas7bdat, $(RDIR)/%.csv, $(SASDATA))
#########
#TARGETS#
#########
all: $(STCMD_OUT) $(CSV_OUT)
$(STCMD_OUT): %.stcmd: %.sas7bdat statTransferOptions.txt
cp $(RDIR)/statTransferOptions.txt $@
echo copy $(RDIR)/$< delim $(RDIR)/$(basename $<).csv -v -y >> $@
echo quit >> $@
$(CSV_OUT): %.csv: %.stcmd
st $(RDIR)/$<
clean:
rm $(STCMD_OUT)
rm $(CSV_OUT)
Однако правильным вариантом может быть отладка пакета CRAN sas7bdat, чтобы была доступна вся цепочка инструментов, а не запуск проприетарного statTransfer.