0

makefile を使用して、テキスト ファイルや他のデータセットなどで動作する複数の Stata ファイルを実行しています。依存関係を変更しなくても、make を実行するたびに が実行されます。analysis.do メイクファイルは次のとおりです。

.PHONY: clean spotless

STATACOMMAND=/opt/stata/stata-mp -b

analysis.txt: analysis.do uniform.dta normal.dta
    $(STATACOMMAND) analysis.do

uniform.dta: uniform.do
    $(STATACOMMAND) uniform.do

normal.dta: normal.do noise.txt
    $(STATACOMMAND) normal.do

clean:
    -rm *.log

spotless: clean
    -rm analysis.txt
    -rm *.dta

分析を行う

use normal.dta, clear
merge t using uniform.dta
log using analysis.txt, text
regress norm unif
log close

正常です。

clear
insheet using "noise.txt", clear
gen t = _n
gen norm = rnormal()
sort t
save normal.dta, replace

制服を着る

clear
set obs 10
gen t = _n
gen unif = runiform()
sort t
save uniform.dta, replace

ノイズ.txt

noise
14
49
59
63
55
13
60
54
26
39

私の実際のコードには、この問題を示すファイルがもっとたくさんありますが、この簡単な例が少なくとも問題を絞り込むのに役立つことを願っています。

更新: ファイルの変更時間は何らかの形で更新されていませんか? make -dmakefile を実行するたびに、最後に次のメッセージが表示されます。

Finished prerequisites of target file `analysis.txt'.
 Prerequisite `analysis.do' is older than target `analysis.txt'.
 Prerequisite `uniform.dta' is newer than target `analysis.txt'.
 Prerequisite `normal.dta' is newer than target `analysis.txt'.
Must remake target `analysis.txt'.

別の例を次に示します。私がmake数回走ったとしましょう。ファイルの変更時間は次のとおりです。

-rw-r--r-- 1 ricardo ricardo  105 Mar  1 19:25 analysis.do
-rw-r--r-- 1 ricardo ricardo 1.1K Mar  2 13:26 analysis.log
-rw-r--r-- 1 ricardo ricardo 1.5K Mar  1 19:25 analysis.txt
-rw-r--r-- 1 ricardo ricardo  317 Mar  1 19:41 makefile
-rw-r--r-- 1 ricardo ricardo   36 Mar  1 19:34 noise.txt
-rw-r--r-- 1 ricardo ricardo  103 Mar  1 19:33 normal.do
-rw-r--r-- 1 ricardo ricardo  803 Mar  1 19:38 normal.dta
-rw-r--r-- 1 ricardo ricardo 1007 Mar  1 19:38 normal.log
-rw-r--r-- 1 ricardo ricardo   83 Mar  1 19:28 uniform.do
-rw-r--r-- 1 ricardo ricardo  594 Mar  1 19:38 uniform.dta
-rw-r--r-- 1 ricardo ricardo  991 Mar  1 19:38 uniform.log

再び走った後make、ここに時間があります。Stata によって自動的に生成されるファイルを除いて、時間は変わりません。.log

-rw-r--r-- 1 ricardo ricardo  105 Mar  1 19:25 analysis.do
-rw-r--r-- 1 ricardo ricardo 1.1K Mar  2 13:29 analysis.log
-rw-r--r-- 1 ricardo ricardo 1.5K Mar  1 19:25 analysis.txt
-rw-r--r-- 1 ricardo ricardo  317 Mar  1 19:41 makefile
-rw-r--r-- 1 ricardo ricardo   36 Mar  1 19:34 noise.txt
-rw-r--r-- 1 ricardo ricardo  103 Mar  1 19:33 normal.do
-rw-r--r-- 1 ricardo ricardo  803 Mar  1 19:38 normal.dta
-rw-r--r-- 1 ricardo ricardo 1007 Mar  1 19:38 normal.log
-rw-r--r-- 1 ricardo ricardo   83 Mar  1 19:28 uniform.do
-rw-r--r-- 1 ricardo ricardo  594 Mar  1 19:38 uniform.dta
-rw-r--r-- 1 ricardo ricardo  991 Mar  1 19:38 uniform.log

これが問題でしょうか?

4

2 に答える 2

4

問題は次のとおりです。

dta/raw4a.dta dta/raw4b.dta: raw4.do raw4datasource/ftp/%.csv
    $(STATA) raw4.do

raw4datasource/ftp/%.csv: ;

最初のルールは、あなたが考えていることをしません。前提条件リストには「%」がありますが、ターゲットにはありません。これはパターン ルールではありません。これらのターゲットは、フォームのすべての既存のファイル (またはビルド可能なファイル) に依存するのではなくraw4datasource/ftp/{something}.csv、ターゲットに依存しraw4datasource/ftp/%.csvます。%そうです、名前にが含まれるファイルです。そのファイルは存在しません。2 番目のルールは何もしないため、ビルドされません。

このような 4 つのルールがあり、他のものはそれらに依存しています。

これらのルールの設計を再考する必要があります。それらに何をしてもらいたいかを決定し、それらを機能させる方法を理解し、残りのメイクファイルにフックする前に、それらを個別にテストします

于 2013-02-18T18:08:36.550 に答える
1

stataに問題があるようです。私はこのツールを使用したことがありませんが、ドキュメントanalysis.logを参照すると、代わりにanalysis.txt次のスクリプトを試してみてください。

use normal.dta, clear
merge t using uniform.dta
log using analysis, replace text
regress norm unif
log close
于 2013-03-03T09:42:24.630 に答える