2015-07-01 1 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; 

С другой стороны, если вы пытаетесь прочитать все файлы в папке, я думаю, вы должны создавать список имен файлов в наборе данных, используйте шаг данных с параметром имени файла для ввода всех файлов сразу же. Вот краткий способ о том, как это сделать, если все, где в одной папке: https://communities.sas.com/docs/DOC-10426

0

Вот страница, которая имеет код, чтобы получить список файлов в наборе данных

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

так ваш макросы не имеют ни условными (%, если), ни петель (% делают) то я предлагаю вам использовать их в качестве параметрироваться% incudes

Вот инструмент для чтения данных список-оф-файлов, установленных и вызвать программу

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

примечание: при импорте proc всегда устанавливают угадывания до максимального значения; в версии 9.3, которая равна 2147483647;

+1

Ron - on 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;