何千もの市のフォルダーがあります (たとえばcity1
、city2
などですが、実際にNewYork
はBoston
、 などの名前が付いています)。各フォルダには、さらに 2 つのサブフォルダが含まれています:land
とhouse
.
したがって、ディレクトリ構造は次のようになります。
current dictionary
---- city1
----- house
------ many .xlsx files
----- land
----- city2
----- city3
···
----- city1000
すべてのサブディレクトリの完全なリストを取得し、何らかの操作を行いたい (のようにimport excel
)。この問題を処理するマクロ拡張機能があることは知っていますが、より深いものではなく、のようなサブディレクトリlocal list: dir
のみを返すことができるようです。first tier
city_i
より具体的には、すべてのハウス フォルダー内でアクションを実行したい場合、どのようなワークフローが必要ですか?
私は自分の目標を達成するためにコードを書く最初の試みをしました:
cd G:\Data_backup\Soufang_data
local folder: dir . dirs "*"
foreach i of local folder {
local `i'_house : dir "G:\Data_backup\Soufang_data\``i''\house" files "*.xlsx"
local count = 1
foreach j of local `i'_house {
cap import excel "`j'",clear
cap sxpose,clear
cap drop in 1/1
if `count'==1 {
save `i'.dta, replace
}
else {
cap qui append using `i'
save `i'.dta,replace
}
local ++count
}
}
次の点に問題があります。
``i''
とにかく、ディレクトリでは、成功せずに機能させるのに苦労しました。
このプロジェクトに関する別の投稿があります。
補足事項:
Nick が指摘しているように、問題を引き起こすのはバック スラッシュです。しかし、その点から移動すると、別の問題に遭遇します。たとえば、複雑なアクションを除いて、ループが機能するかどうかをテストしたいだけなので、次のコード スニペットを記述します。
set more off
cd G:\Data_backup\Soufang_data
local folder: dir . dirs "*"
foreach i of local folder {
di "`i'"
local `i'_house : dir "G:\Data_backup\Soufang_data/`i'\house" files "*.xlsx"
foreach j of local `i'_house {
di "`j'"
}
}
ただし、画面上の結果は次のようになります。
city1
project100
project99
······
project1
コードは最初の都市で 1 ラウンドだけループするようですが、 には到達できませcity2
んcity3
。特にこの行で、問題のあるローカルの書き込みが原因であると思われますが、よくわかりません:
foreach j of local `i'_house