2016-03-22 17 views
0

Sorumun sorumlusu biraz belirsiz olabilir. Önceden, "alt dizinlerin tam listesini almak" istiyorum ve sonra bu alt dizinlerdeki dosyaları stata olarak okumak istiyorum (bkz. this post ve this post). @Roberto Ferrer'ın büyük önerisi sayesinde, neredeyse bunu yapmayı başardım. Ama sonra başka bir sorunla karşılaşıyorum. Çok fazla ayrı dosyam olduğu için, yerel makronun uzunluğu üst sınırına ulaşmış gibi görünüyor. Sonunda 5'e kadar subdirs sayısını azaltmak zaman stata komutu local n:word countMakinedeki maksimum dizgi otomatik olarak nasıl atanır?

macro substitution results in line that is too long 
    The line resulting from substituting macros would be longer than allowed. The maximum allowed length is 645,216 characters, which is calculated on the basis of set maxvar. 

    You can change that in Stata/SE and Stata/MP. What follows is relevant only if you are using Stata/SE or Stata/MP. 

    The maximum line length is defined as 16 more than the maximum macro length, which is currently 645,200 characters. Each unit increase in set maxvar increases the length maximums by 129. The 
    maximum value of set maxvar is 32,767. Thus, the maximum line length may be set up to 4,227,159 characters if you set maxvar to its largest value. 
r(920); 

sonra hata mesajı göndermek, stata çalışıyor. Yaklaşık 100 alt-türe sahip olduğundan, 20 kez eylemleri çoğaltmak için varsayalım. Peki, bu yönetilebilir, ancak hala bu işlemi, daha özel olarak, izin verilen maksimum makro uzunluğunu "boşaltmak" için dosyaları otomatik olarak yedekleyip daha sonra başka bir alt dizin grubu eklemek isteyip istemediğimi bilmek istiyorum. Teşekkür ederim. Takip kodum

Bir makro dosyaların tüm listeyi saklamak gerekmez
//==================================== 
//=== read and clean projects data === 
//==================================== 
version 14 
set linesize 80 
set more off 

clear 
macro drop _all 
set linesize 200 
cd G:\Data_backup\Soufang_data 


*---------------------------------- 
* Read all files within dictionary 
*---------------------------------- 


* Import the first worksheets 1:"项目首页" 2:"项目概况" 3:"成交详情" 
* worksheet1 
filelist, directory("G:\Data_backup\Soufang_data") pattern(*.xlsx) 
* Add pattern(*.xlsx) provent importing add file type(.doc or .dta) 
gen tag = substr(reverse(dirname),1,6) == "esuoh/" 
keep if tag==1 
gen path = dirname+"\"+filename 
qui valuesof path if tag==1 
local filelist = r(values) 

split dirname, parse("\" "/") 
ren dirname4 citylist 
drop dirname1-dirname3 dirname5 
qui valuesof citylist if tag==1 
local city = r(values) 

local count = 1 
local n:word count `filelist' 

    forval i = 1/`n' { 
     local file : word `i' of `filelist' 
     local cityname: word `i' of `city' 

     ** don't add xlsx after `file', suffix has been added 
     ** write "`file'" rather than `file', I don't know why but it works 
     qui import excel using "`file'",clear 
     cap qui sxpose,clear 
     cap qui drop in 1/1 
     gen city = "`cityname'" 


     if `count'==1 { 
      save house.dta,replace emptyok 
     } 
     else   { 
      qui append using house 
      qui save house.dta,replace emptyok 
      } 

     local ++count 
     } 

cevap

2

olduğunu. filelist, birlikte çalışmak istediğiniz bir dosya veritabanı oluşturur. Sadece kaydedin ve işlemek istediğiniz her dosya için yeniden yükleyin. Ayrıca, veri kümelerini eklemek için çok verimsiz bir yol kullanıyorsunuz. Eklenen veri kümesi büyüdükçe, yeniden yükleme ve kaydetme maliyeti çok yükselir ve tüm işlemi bir taramayı yavaşlatabilir.

İşte Excel dosyaları gecikmiş cevap için

filelist, directory(".") pattern(*.xlsx) 
save "myfiles.dta", replace 

local n = _N 

forval i = 1/`n' { 

    use in `i' using "myfiles.dta", clear 

    local f = dirname + "/" + filename 

    qui import excel using "`f'",clear 

    tempfile res`i' 
    save "`res`i''" 

} 

clear 
forval i = 1/`n' { 

    append using "`res`i''" 

} 

save "final.dta", replace 
+0

Maalesef işlemek için nasıl bir taslak verilmiştir. Teşekkürler, @Robert Picard, yaklaşımınız mükemmel çalışıyor. Birisi benim gibi çok sayıda dosya almak isterse, dikkat edilmesi gereken bir şey daha: do dosyasının beklenmedik şekilde sonlanmasını önlemek için komuttan önce 'cap noi 'eklemeniz daha iyi olur – zlqs1985