0

何千もの市のフォルダーがあります (たとえばcity1city2などですが、実際にNewYorkBoston、 などの名前が付いています)。各フォルダには、さらに 2 つのサブフォルダが含まれています:landhouse.

したがって、ディレクトリ構造は次のようになります。

current dictionary
  ---- city1
     ----- house 
         ------ many .xlsx files
     ----- land
  ----- city2
  ----- city3
  ···
  ----- city1000

すべてのサブディレクトリの完全なリストを取得し、何らかの操作を行いたい (のようにimport excel)。この問題を処理するマクロ拡張機能があることは知っていますが、より深いものではなく、のようなサブディレクトリlocal list: dirのみを返すことができるようです。first tiercity_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 ラウンドだけループするようですが、 には到達できませcity2city3。特にこの行で、問題のあるローカルの書き込みが原因であると思われますが、よくわかりません:

foreach j of local `i'_house
4

2 に答える 2

3

実際に提示されている問題の解決策ではありませんが、より簡単な方法はfilelist、SSC ( ssc install filelist) から を使用することです。

例は次のとおりです。

. // list all files
. filelist, directory("D:\Datos\RFERRER\Desktop\example")
Number of files found = 5

. 
. // strange way of tagging directories ending in "\house"
. // change at will
. gen tag = substr(reverse(dirname),1,6) == "esuoh/"

. 
. order tag

. list

     +----------------------------------------------------------------------------------------------+
     | tag   dirname                                                     filename             fsize |
     |----------------------------------------------------------------------------------------------|
  1. |   0   D:\Datos\RFERRER\Desktop\example/proj_1                     newfile.txt              0 |
  2. |   1   D:\Datos\RFERRER\Desktop\example/proj_2/house               somefile.txt             0 |
  3. |   0   D:\Datos\RFERRER\Desktop\example/proj_3/subproj_3_2         newfile2.txt             0 |
  4. |   1   D:\Datos\RFERRER\Desktop\example/proj_3/subproj_3_2/house   anothernewfile.txt       0 |
  5. |   1   D:\Datos\RFERRER\Desktop\example/proj_3/subproj_3_2/house   someotherfile.txt        0 |
     +----------------------------------------------------------------------------------------------+

その後、変数 を条件としてkeeporを使用します。droptag

グラフィカルに、ディレクトリは次のようになります。

ここに画像の説明を入力

(私は Stata 13help string functionsを使用しています。他のタグ付け方法を確認してください。)

于 2016-02-22T16:45:30.077 に答える
0

あなたの改訂された問題は、

local folder: dir . dirs "*"
foreach i of local folder {
     di "`i'"
     local house : dir  "G:\Data_backup\Soufang_data/`i'\house" files "*.xlsx"

     foreach j of local house {
        di "`j'"
     }
}

しかし、ファイル構造やファイル名は明らかにわかりません。

于 2016-02-23T08:57:20.570 に答える