У меня есть короткий do-файл в Stata, который использует цикл для чтения некоторых наборов данных по одному и добавления их в временный файл. Однако этот временный файл не найден при попытке открыть его в конце.
Запуск этого скрипта в Windows и MacOS (Stata 17):
clear
set more off
set trace on
local patha "<patha>"
local pathb "<pathb>"
use "`pathb'fileb.dta", clear
levelsof pathb_variable, local(l)
tempfile append_file
foreach i of local l {
capture confirm file "`patha'filea_`i'.dta"
if _rc==0 {
capture append using `append_file'
save `append_file', replace
}
}
use `append_file', clear
Поскольку set trace
включен, я вижу, что первая строка, которая выполняется в Stata, перед clear
и set more off
:
do "C:\Users\...\AppData\Local\Temp\10\STD7578_000000.tmp"
в Windows и
do "/var/folders/02/50xtwnrn5yb_wrh_md7s23br0000gn/T//SD26113.000000"
на Mac.
Сообщение об ошибке, которое появляется сразу после запуска use `append_file', clear
:
file C:\Users\...\AppData\Local\Temp\10\ST_7578_000001.tmp not found
в Windows и
file /var/folders/02/50xtwnrn5yb_wrh_md7s23br0000gn/T//S_26113.000001 not found
на Mac.
В обоих случаях похоже, что создается другой временный файл, а не тот, к которому осуществляется доступ? Имя файла временного файла, который он пытается открыть, заменило «D» на «_», а последняя цифра — «1», а не «0».
Как заставить этот скрипт работать?
Ты прав, Ник. В следующий раз сделаю, так как это хорошая практика. Мое оправдание за это только на этот раз: мне удалось найти решение за время, которое я бы потратил на размышления о том, как сделать воспроизводимый пример для этого, и я предположил, что кто-то мог столкнуться с подобной проблемой, просто прочитав (почти псевдо)скрипт и вывод выше.
Я думаю, что менее подвержено ошибкам сохранение временного файла в виде пустого файла для добавления вместо использования capture
без обработки кода ошибки.
use "`pathb'fileb.dta", clear
levelsof pathb_variable, local(l)
tempfile append_file
preserve
clear
save `append_file', emptyok
restore
foreach i of local l {
capture confirm file "`patha'filea_`i'.dta"
if _rc==0 {
append using `append_file'
save `append_file', replace
}
}
use `append_file', clear
Нет ничего плохого в том, чтобы поместить имена файлов в " "
. Это, кажется, не проблема здесь.
capture
хорошо делает то, что было задумано, но когда он ловит ошибку, вам нужно увидеть, что это была за ошибка с else di _rc
.
Спасибо, я понял, что save `append_file', emptyok
после инициализации временного файла все заработало, поэтому было приятно получить подтверждение от вашего ответа. Что делают preserve
, clear
и restore
вокруг сохранения пустого временного файла?
Приятно знать о цитатах, @NickCox. Я все равно добавил кавычки в свой код: save `"`append_file'"', replace
preserve
сохраняет моментальный снимок данных, которые восстанавливаются после restore
, так что все, что вы делали в промежутке, отклоняется. clear
следит за тем, чтобы во временный файл не было включено ничего из "pathb'fileb.dta". Это может быть не то, что вам нужно в данном конкретном случае, но часто это необходимо.
Я думаю, это очевидно, но здесь все по-другому: такие проблемы очень сложны, а у нас нет возможности телепортироваться в вашу комнату и просматривать ваши файлы. Все, что вы можете сделать, чтобы привести воспроизводимый пример, поможет.