【问题标题】:SAS: attempting to build a loop for uploading multiple filesSAS:尝试建立一个循环上传多个文件
【发布时间】:2015-07-01 18:30:55
【问题描述】:

我正在尝试在 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 上传,或者在循环中使用另一个数据步骤?

我收到错误“比(某物)更多的位置变量”(我忘记了确切的错误,但它列出了位置变量)。我尝试在宏中添加和删除逗号,但无法摆脱这个错误。有什么想法吗?

【问题讨论】:

  • 没有我熟悉的proc上传。
  • @Reeza PROC UPLOAD 是 SAS/Connect 的一部分。它不再被广泛使用。
  • 上传到哪里? SAS 服务器、ftp、http?
  • 您的 WeatherPrepare 宏似乎对从 CSV 文件导入的表中的字段名称进行了假设。如果您知道 CSV 文件的结构,那么您应该使用数据步骤而不是 PROC IMPORT 来读取它们。这将避免 PROC IMPORT 不得不猜测你的变量是什么而引起的许多麻烦。

标签: sas sas-macro


【解决方案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

【讨论】:

    【解决方案2】:

    这是一个页面,其中包含将文件列表放入数据集中的代码

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

    因为您的宏既没有条件 (%if) 也没有循环 (%do) 那么我建议您将它们用作参数化的 %incudes

    这是一个读取文件列表数据集并调用程序的工具

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

    注意:在 proc import 中,总是将guessingrows 设置为最大值; 在 v9.3 中为 2147483647;

    【讨论】:

    • Ron - 所以,我们不允许答案主要是指向其他地方的链接;答案必须包含回答问题所需的所有信息。
    【解决方案3】:

    根据第一个答案整理出来。最终代码:

    %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; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多