Статический временный файл не найден при использовании добавления, сохранения, использования

У меня есть короткий 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».

Как заставить этот скрипт работать?

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

Nick Cox 03.04.2023 19:16

Ты прав, Ник. В следующий раз сделаю, так как это хорошая практика. Мое оправдание за это только на этот раз: мне удалось найти решение за время, которое я бы потратил на размышления о том, как сделать воспроизводимый пример для этого, и я предположил, что кто-то мог столкнуться с подобной проблемой, просто прочитав (почти псевдо)скрипт и вывод выше.

FullMetalScientist 05.04.2023 18:02
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что менее подвержено ошибкам сохранение временного файла в виде пустого файла для добавления вместо использования 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

Нет ничего плохого в том, чтобы поместить имена файлов в " ". Это, кажется, не проблема здесь.

Nick Cox 03.04.2023 17:58
capture хорошо делает то, что было задумано, но когда он ловит ошибку, вам нужно увидеть, что это была за ошибка с else di _rc.
Nick Cox 03.04.2023 18:26

Спасибо, я понял, что save `append_file', emptyok после инициализации временного файла все заработало, поэтому было приятно получить подтверждение от вашего ответа. Что делают preserve, clear и restore вокруг сохранения пустого временного файла?

FullMetalScientist 05.04.2023 17:50

Приятно знать о цитатах, @NickCox. Я все равно добавил кавычки в свой код: save `"`append_file'"', replace

FullMetalScientist 05.04.2023 17:52
preserve сохраняет моментальный снимок данных, которые восстанавливаются после restore, так что все, что вы делали в промежутке, отклоняется. clear следит за тем, чтобы во временный файл не было включено ничего из "pathb'fileb.dta". Это может быть не то, что вам нужно в данном конкретном случае, но часто это необходимо.
TheIceBear 06.04.2023 08:49

Другие вопросы по теме