输出到文本文件

时间:2017-03-31 15:14:29

标签: sql macros sas proc enterprise-guide

我需要将大量不同的数据集输出到不同的文本文件中。数据集共享一些需要输出的常见变量,但也有很多不同的变量。我已将这些不同的加载到由空格分隔的宏变量中,以便我可以对此进行宏观化。

所以我创建了一个循环数据集的宏,并将每个宏输出到不同的文本文件中。

为此,我在数据步骤中使用了put语句。 PUT语句如下所示:

PUT (all the common variables shared by all the datasets), (macro variable containing all the dataset-specific variables);

E.g:

%MACRO OUTPUT();
    %DO N=1 %TO &TABLES_COUNT;
        DATA _NULL_;
            SET &&TABLE&N;
            FILE 'PATH/&&TABLE&N..txt';
            PUT a b c d "&vars";
        RUN;
    %END;
%MEND OUTPUT;

其中& vars是包含在当前循环中输出数据集所需的所有变量的宏变量。 例如,哪个解决了:

PUT a b c d special1 special2 special5 ... special329;

现在的问题是,引用的字符串只能是262个字符。我试图输出的一些数据集有很多变量要输出,这个宏变量是一个带引号的字符串,并且包含所有这些变量将比这长得多。我还有其他方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:2)

不要在变量名列表中包含引号。

put a b c d &vars ;

对于可以输出的变量数量应该没有任何限制,但如果输出行的长度变得太长,SAS将换行到新行。默认行长度目前为32,767(但旧版本的SAS使用256作为默认行长度)。如果你愿意,你可以设置更高的值。所以你可以使用1,000,000例如。上限可能取决于您的操作系统。

FILE "PATH/&&TABLE&N..txt" lrecl=1000000 ;

如果您只是想确保公共变量出现在前面(也就是说您没有排除任何变量),那么您可能根本不需要每个表的变量列表。

DATA _NULL_;
  retain a b c d ;
  SET &&TABLE&N;
  FILE "&PATH/&&TABLE&N..txt" lrecl=1000000;
  put (_all_) (+0) ;
RUN;

答案 1 :(得分:1)

我会解决这个问题,但每个变量都有1个put语句。使用@修饰符,以便您不会获得新行。

例如:

data test;
a=1;
b=2;
c=3;
output;
output;
run;

data _null_;
set test;
put a @;
put b @;
put c @;
put;
run;

将此输出到日志:

800  data _null_;
801  set test;
802  put a @;
803  put b @;
804  put c @;
805  put;
806  run;

1 2 3
1 2 3
NOTE: There were 2 observations read from the data set WORK.TEST.
NOTE: DATA statement used (Total process time):
      real time           0.07 seconds
      cpu time            0.03 seconds

因此,修改宏以使用此语法循环遍历两组值。

答案 2 :(得分:1)

不确定为什么你在谈论引用的字符串:你不会引用& vars参数。

put a b c d &vars;

不是

put a b c d "&vars";

那里有一个限制,但它要高得多(64k)。

那就是说,我会用CALL EXECUTE以数据驱动的方式做到这一点。这非常简单,只需一步即可完成,假设您可以轻松确定从WHERE语句中的字典表中输出哪些数据集。这总共有32kiB的限制,但是如果你真的想要解决它,你可以很容易地解决它(你可以将各个位分成多个调用,甚至构建调用,这样如果调用符击到32000长你用它发出一个调用执行,然后继续)。

这避免了必须管理一堆大的宏变量(你的&VAR真的会是&&VAR&N并且会有很多大的宏变量。)

data test;
  length vars callstr $32767;
  do _n_ = 1 by 1 until (last.memname);
    set sashelp.vcolumn;
    where memname in ('CLASS','CARS');
    by libname memname;
    vars = catx(' ',vars,name);
  end;
  callstr = catx(' ',
    'data _null_;',
    'set',cats(libname,'.',memname),';',
    'file',cats('"c:\temp\',memname,'.txt"'),';',
    'put',vars,';',
    'run;');
    call execute(callstr);
run;