2015-09-25 50 views
0

我有大量需要在SAS數據集中創建的文件。我把所有的文件的名稱在SAS數據集,例如:SAS將數據集元素轉換爲變量

doc_names 
1. filename1 
2. filename2 
     . 
     . 
     . 

所以我需要訪問每個文件名,與文件路徑串聯,並告訴SAS抓住該文件並進行數據集出來了。

例如,如果我是R中這樣做,它會是這個樣子:

path = 'path-to-files' 
filenames = readLines('file-with-filenames.txt') 
for (i in 1:length(filenames)) { 
    current.file = filenames[i] 
    full.file = paste0(path, current.file) 
    data.set = read.csv(full.file) 
} 

它基本上current.file = filenames[i]部分,我不能在SAS弄清楚。我需要能夠從數據集的特定條目中創建一個宏變量,以便我可以將它與該路徑連接起來,然後告訴SAS它是一個文件名。

P.S.,我知道我可以創建一個新的數據集條目,它具有文件的完整路徑。這一切都很好,但這不是問題的核心。

感謝您的幫助!

+0

我們可以假設您確實需要X個獨立的數據集嗎? SAS可以將所有文件讀取到一個文件中,並通過一個步驟識別它來自哪個文件 - 使用通配符和/或filevar/filename選項。一般來說,最好有一個數據集並進一步使用BY處理。 – Reeza

回答

0

假設您有一個包含您在代碼中的讀數的宏[例如%readin(file=)其中包含proc導入或你有什麼],你有很多選擇。最簡單的:

proc sql; 
    select cats('%readin(file=',filename,')') 
    into :readinlist separated by ' ' 
    from yourdataset; 
quit; 

如果路徑是固定的,你可以是添加到您的readin宏(硬編碼),或將其作爲一個參數添加到您的readin宏,或將其添加到上述串聯 - 無論品牌對你的問題最有意義。

1

就我個人而言,我發現使用數據步驟爲這種類型的一次性編程任務生成代碼要容易得多。因此,請從您的文件中讀取文件名,使用該文件的完整路徑的名稱以及要將CSV文件導入到的數據集名稱創建變量。然後,您可以獲得編寫PROC IMPORT語句所需的全部信息。

filename code temp; 
data filenames ; 
    length path $100 filename $100 dsname $32 fullname $200 ; 
    path = 'path-to-files' ; 
    infile 'file-with-filenames.txt' truncover; 
    input filename $100.; 
    fullname=catx('/',path,filename); 
    dsname = scan(filename,1,'.'); 
    file code ; 
    put 'proc import datafile=' fullname :$quote. 'out=' dsname 
    /' dbms=dlm replace ; ' 
    /' delimiter=","; ' 
    /'run;' 
    ; 
run; 
%include code/source2 ; 

而且在現實中,我不知道我會相信無論是PROC IMPORT或read.csv()始終如一地轉換一系列文件到相同的結構。如果CSV文件都包含相同類型的信息,我會將它們全部讀入一個數據集。所以如果你的CSV文件都有四個變量,那麼這個數據步驟將把它們全部讀入一個數據集。

data all_data ; 
    length path $100 filename $100 fullname $200 ; 
    path = 'path-to-files' ; 
    infile 'file-with-filenames.txt' truncover; 
    input filename $100.; 
    fullname=catx('/',path,filename); 
    infile csv filevar=fullname dsd truncover end=eof ; 
    * skip the header line; 
    if not eof then input ; 
    do while (not eof); 
    length var1 var2 8 var3 $20 var4 8 ; 
    informat var2 date9.; 
    input var1-var4 ; 
    output; 
    end; 
run; 
+0

這個話題需要有一個主要的問題,幾乎每隔一天就會出現:) – Reeza

相關問題