2015-11-04 38 views
4

我正在綁定將逗號分隔的文本文件轉換爲管道分隔文件,但我的輸入文件名(逗號分隔文件)是一個變量(flname1)。我正在使用下面的代碼由一個stackoverflow成員建議。代碼工作很好,只要我在INFILE語句中指定的文件名,但我不知道如何爲可變指定在infile語句中指定文件名作爲變量

data _null_; 
    enddate=date(); 
    flname1=compress("d:\temp\wq_" || year(enddate) || put(month(enddate),z2.) || ".txt"); 
    length x1-x6 $200; 
    infile 'flname1' dsd dlm=',' truncover; 
    file 'C:\temp\pipe.txt' dsd dlm='|'; 
    input x1-x6; 
    put x1-x6; 
run; 

我是新的文件名SAS和任何幫助將不勝感激。謝謝!

+0

你在infile語句上試過'filevar'選項嗎? https://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000146932.htm – Reeza

+2

略顯偏離主題,但爲了讓您的生活更輕鬆,您還應該考慮使用' cat()'函數執行連接。有幾個 - catt()cats()cat()catx()'。它們提供了一些生活質量改進,例如處理數字和字符之間的類型轉換,修剪以及添加分隔符等等。使用雙管符號'||'現在已經過時,但傳播了大量遺留白皮書和培訓材料。它也將消除對'compress()'語句的需要。 –

+0

創建管道分隔文件的要點是什麼? –

回答

0

你可能想要將其作爲一個宏變量來實現 - 這不是filevar的正常用法(如果你有一個包含一堆文件名的數據集或其他東西)。

%let filename = d:\temp\wq_%sysfunc(today(),YYMMN6.).txt; 
%put &=filename; 

data _null_; 
    length x1-x6 $200; 
    infile "&filename." dsd dlm=',' truncover; 
    file 'C:\temp\pipe.txt' dsd dlm='|'; 
    input x1-x6; 
    put x1-x6; 
run; 

宏變量只是文本替換,因此它們可用於任何你可以輸入同樣的事情,他們也不需要串聯功能 - 比你有任何更多的,當你鍵入一個詞串聯 - 這樣做更容易。

在這裏,我用%sysfunc告訴SAS執行TODAY()函數,第二個參數告訴它如何格式化 - YYMMN6.就是你看起來像你想(201506或類似)的格式。然後只要確保使用"報價不是'報價,因爲後者不會讓宏變量解決。

+0

@喬 - 謝謝。有效! – asmi

2

您應該能夠使用filevar選項在infile聲明,如:

data _null_; 
    enddate=date(); 
    flname1=compress("d:\temp\wq_"||year(enddate)||put(month(enddate),z2.)||".txt"); 
    length x1-x6 $200; 
    infile myinputfile dsd dlm=',' filevar=flname1 truncover; 
    file 'C:\temp\pipe.txt' dsd dlm='|'; 
    input x1-x6; 
    put x1-x6; 
run; 

documentation詳細解釋了該選項,並有其例5

祺使用的例子, 埃米爾。