2015-07-01 74 views
0

我試圖在SAS中構建一個循環來上傳幾個文件,並且遇到了幾個需要解決的問題。當前代碼:SAS:試圖構建一個循環來上傳多個文件

%Macro Weatherupload(File=, output=); 
proc import datafile = &File; 
out = &output; 
dbms=dlm replace; 
delimiter= ","; 
getnames=yes; 
guessingrows = 1000; 
run; 
%Mend Weatherupload; 

%Macro WeatherPrepare(input=, output=); 
data &output (keep=Wban_Number _YearMonthDay DewPoint Temp _Avg_Dew_Pt _Avg_Temp year month day); 
set &input; 
DewPoint = Input(compress(_Avg_Dew_Pt,"*"), 3.); 
Temp = Input(compress(_Avg_Temp,"*"), 3.); 
year = (_yearmonthday - mod(_yearmonthday, 10000))/10000; 
month = ((_yearmonthday - mod(_yearmonthday, 100)) - (_yearmonthday - mod(_yearmonthday,10000)))/100; 
day = mod(_yearmonthday, 100); 
drop _Avg_Dew_Pt _Avg_Temp _YearMonthDay; 
run; 
%Mend WeatherPrepare; 

data temperatures; 
do i = 1999 to 2015; 
do j = 1 to 12; 
name = 'C:\Users\DILLON.SAXE\Documents\'||i||j||'.tar'||' \'||i||j||'daily.txt'; 
output = i||j||'weather'; 
final = i||j||'final'; 
%Weatherupload(File=name, output=output) 
%WeatherPrepare(input=output, output=final) 
end; 
end; 
run; 

的目標是通過幾個文件來運行,在多個文件夾,在月+日+標題的其餘部分列出,(目前)上傳數據的兩個變量從他們。後來我會想要添加合併文件,並做更多的數據工作,但目前這是宏觀問題和上傳的問題。

有沒有辦法在循環中使用proc上傳,或者在循環中使用另一個數據步驟?

我得到的錯誤「比(某物)更多的位置變量」(我忘記了確切的錯誤,但它列出了位置變量)。我試過在宏中添加和刪除逗號,但一直無法擺脫這個錯誤。有任何想法嗎?

+0

沒有我熟悉的proc上傳。 – Reeza

+0

@Reeza [PROC UPLOAD](http://support.sas.com/documentation/cdl/en/connref/61908/HTML/default/viewer.htm#a002558373.htm)是SAS/Connect的一部分。它不再被廣泛使用。 – Joe

+0

上傳哪裏? SAS服務器,FTP,HTTP? – vasja

回答

1

我不認爲你可以在你的數據步驟中調用宏。我想你打算使用Call Execute

data temperatures; 
do i = 1999 to 2015; 
do j = 1 to 12; 
name = 'C:\Users\DILLON.SAXE\Documents\'||i||j||'.tar'||' \'||i||j||'daily.txt'; 
output = i||j||'weather'; 
final = i||j||'final'; 
call execute('%Weatherupload(File='||name||', output='||output||')'); 
call execute('%WeatherPrepare(input='||output||', output='||final||')'); 
end; 
end; 
run; 

或者,假設你想讀一個文件夾中的所有文件,我想你應該在數據集創建文件名的列表,請使用filename選項輸入所有文件的數據的步驟一次而已。下面是關於如何做到這一點,如果都在一個文件夾,一個簡短的方法:https://communities.sas.com/docs/DOC-10426

0

這裏是一個網頁,有代碼來獲得文件的列表到數據集

http://www.sascommunity.org/wiki/Making_Lists

因爲你宏既沒有條件語句(%IF)也不環路(%做) 那麼我建議你使用它們作爲參數%incudes

這裏是讀取列表中,文件中的數據集和調用程序的工具

http://www.sascommunity.org/wiki/Call_Execute_Parameterized_Include

注意:在proc import中總是將猜測值設置爲最大值; in v9.3即2147483647;

+1

羅恩 - 在SO上,我們不允許那些主要只與別處有聯繫的答案;答案必須包含所有信息才能回答問題。 – Joe

0

根據第一個答案對它進行了整理。最終的代碼:

%Macro Weatherupload(File=, output=); 
proc import datafile = "&File" 
out = &output 
dbms=dlm replace; 
delimiter= ","; 
getnames=yes; 
guessingrows = 1000; 
run; 
%Mend Weatherupload; 

%Macro WeatherPrepare(input=, output=); 
data &output; 
set &input; 
DewPoint = Input(compress(_Avg_Dew_Pt,"*"), 3.); 
Temp = Input(compress(_Avg_Temp,"*"), 3.); 
year = (_yearmonthday - mod(_yearmonthday, 10000))/10000; 
month = ((_yearmonthday - mod(_yearmonthday, 100)) - (_yearmonthday - mod(_yearmonthday,10000)))/100; 
day = mod(_yearmonthday, 100); 
keep Wban_Number DewPoint Temp year month day; 
run; 
%Mend WeatherPrepare; 

%Macro WeatherPrepare2(input=, output=); 
data &output; 
set &input; 
DewPoint = Input(DewPoint, 3.); 
Temp = Input(compress(_Avg_Temp,"*"), 3.); 
year = (_yearmonthday - mod(_yearmonthday, 10000))/10000; 
month = ((_yearmonthday - mod(_yearmonthday, 100)) - (_yearmonthday - mod(_yearmonthday,10000)))/100; 
day = mod(_yearmonthday, 100); 
Wban_Number = Wban; 
keep Wban_Number DewPoint Temp year month day; 
run; 
%Mend WeatherPrepare; 

%Macro Append(merge=); 
data temperatures; 
set temperatures &merge; 
%Mend Append; 

data temperatures; 
do i = 1999 to 2015; 
do j = 1 to 12; 
jzero = put(j, z2.); 
name = compress('C:\Users\DILLON.SAXE\Documents\'||i||jzero||'.tar'||'\'||i||jzero||'daily.txt'); 
name2 = compress('C:\Users\DILLON.SAXE\Documents\'||'QCLCD'||i||jzero||'\'||i||jzero||'daily.txt'); 
output = compress('weather'||i||j); 
final = compress('final'||i||j); 
if 1000*i+j < 200708 then 
do; 
call execute('%Weatherupload(File='||name||', output='||output||')'); 
call execute('%WeatherPrepare(input='||output||', output='||final||')'); 
end; 
else 
do; 
call execute('%Weatherupload(File='||name2||', output='||output||')'); 
call execute('%WeatherPrepare2(input='||output||', output='||final||')'); 
end; 
call execute('%Append(merge='||final||')'); 
end; 
end; 
drop i j jzero name name2 output final; 
run; 
相關問題