2016-06-15 27 views
0

Ich arbeite mit Stata und bin ein Anfänger. Ich habe eine Frage bezüglich des Erlangens von Ordnernamen. Ich habe ein Verzeichnis, \ Test \ abc, dass die folgenden Ordner wie folgt hat:Parsing durch alle Ordner in einem Verzeichnis

Q100 
Q101 
Q102 
.... 

Ich möchte in jeden Ordner gehen, Q * (wobei * etwas nach dem Q bezeichnet), finden Sie eine Datei mit dem Namen "filenameQ *", machen Sie etwas und senden Sie die Ausgabe dann zurück an \ Test \ abc. Der folgende Code zeigt die Idee, was ich tun möchte, wobei varlist Q * das Array aller Ordner im Verzeichnis angibt, die mit Q beginnen. Ordnernamen sind jedoch keine Variablen, daher weiß ich nicht, wie ich vorgehen soll .

cd "\\Test\abc" 
foreach x of varlist Q* /* FOLDER NAMES */ { 
    cd "`x'" 
    use "filename`x'" 
    display something and send it back to directory "\\Test\abc" 
    cd .. 
} 

Antwort

4

Es gibt ein Benutzer geschriebenen Befehl namens folders, die die Namen der Ordner in einem lokalen r gespeichert werden (Ordner). Es gibt einen anderen Befehl namens fs, der das Gleiche für Dateien tut.

Hier ist ein Beispiel dafür, wie Sie diese (bei Ihrer Bestellung Einschränkung in den Kommentaren) tun könnten:

capture ssc install fs, replace 
cd "~/Desktop/Test/abc" 

/* Get a list of years to loop over by stripping out Q[0-9] stubs, quotes, and de-dupeing */ 
folders Q* 
local years=ustrregexra(`"`=ustrregexra(`"`r(folders)'"',"Q[0-9]","")'"',`"""',"") 
local years: list uniq years 

foreach y of local years { 
    folders Q?`y' 

    foreach d in `r(folders)' { 
    cd "`d'" 
    fs filename* 
     foreach f in `r(files)' { 
      ls `f' 
     } 
    cd .. 
    } 
} 
+0

'Ordner' und' fs' sind im selben Paket 'fs', also ist eine Installation ausreichend. –

+0

Vielen Dank! Eine andere Frage - wie würde ich den Inhalt von Ordnern sortieren, wenn die Q * nicht in Ordnung sind? – JDY

+0

@Justin Sowohl "Ordner" als auch "fs" listet die Dinge in aufsteigender Reihenfolge auf. Wie würdest du diese sortieren wollen? –

2

Stata eine Reihe von erweiterten Funktionen für Makros hat. Siehe help extended_fcn als Referenz. Eine dieser erweiterten Funktionen hilft Ihnen, Namen von Ordnern und Dateien zu erfassen.

Um eine Liste von Ordnern in einem lokalen Makro mit dem Namen folderList verwenden

local folderList : dir "<PATH1>" dirs "Q*" 

wo

<PATH1> 

ist der Pfad zu dem Ordner von Interesse enthält Ordner gespeichert zu bekommen.

* get the list of folders 
local path1 <PATH1> 
local folderList : dir "`path1'" dirs "Q*" 

* loop through folders 
foreach folder of local folderList { 
    * get list of files 
    local fileList : dir "`path1'/`folder'" files "filenameQ*" 

    * loop through files 
    foreach file of local fileList { 
    * do stuff to file 
    use `file' 
    ** do more stuff 
    } 
} 

Ich entfernte die cd Teil, wie es oft vorzuziehen ist, die gleiche Arbeitsverzeichnis zu halten: Sie können in ähnlicher Weise Dateinamen in einem Ordner mit

local fileList : dir "<PATH2>" files "filenameQ*" 

Hier ist die Grundidee mit zwei foreach Schlaufen ziehen um die gleichen Ausgabepfade unabhängig vom Ort der aktuellen Datei von Interesse zu spezifizieren.

Verwandte Themen