数据步骤中的文件语句,用于导出逗号分隔的文本文件

时间:2015-08-07 03:00:42

标签: sas

问题:假设我不知道变量名和变量数。或者想象有太多的变量我无法写出put语句。

以下情况是我知道有3个变种

data _null_;
    set meeting;
    file 'C:\Users\Desktop\meeting2.txt' dlm=',';
    put region mtg sendmail;
run;

我尝试使用put _all_; 输出是:

region=N mtg=24NOV1999 sendmail=10OCT1999 _ERROR_=0 _N_=1
region=S mtg=28DEC1999 sendmail=13NOV1999 _ERROR_=0 _N_=2
region=E mtg=03DEC1999 sendmail=19OCT1999 _ERROR_=0 _N_=3
region=W mtg=04OCT1999 sendmail=20AUG1999 _ERROR_=0 _N_=4

虽然它不提供comman分隔格式,而是命名格式

我想要的输出是

N,24NOV1999,10OCT1999
S,28DEC1999,13NOV1999
E,03DEC1999,19OCT1999
W,04OCT1999,20AUG1999

6 个答案:

答案 0 :(得分:2)

你有这么多答案看起来有效,但有不同的角色的原因是重要的是将_all_改为(_all_)。之后的论点并不重要。

详细解释here,你写的时候实际上有两件完全不同的事情

put _all_;

put (_all_) (:);

熟悉重载函数概念的程序员会发现这是最简单的思考方式。如果put看到_all_,则会调用put的一个版本。如果它看到(_all_)(或其周围带有()的任何变量列表),则会调用另一个(将_all_扩展到其变量列表)。请注意,如果您尝试

put (_all_);

它失败了,它失败了,错误表明它正在尝试调用格式化输入(即,它询问你为什么不在那里有另一个(,这在格式化输入中是正常的在包含( )的列表之后。)

_all_本身就是argument to put,专门告诉它使用named output输出数据集中的所有变量。因此输出的variable=value格式。所以在第一个例子中,_all_是一个常量 - 一个参数 - 仅此而已。

在第二个示例中,(_all_)variable list,其中包含所有变量,就像输入的那样,以空格分隔。所以

put (_all_) (:);

相当于

put (name sex age height weight) (:);

如果与SASHELP.CLASS一起使用。添加任何东西 - 冒号,波浪号和符号等 - 在格式化输出的上下文中是合法的将导致使用它。

请注意

put _all_ @;

不会导致这种情况发生 - 显然@(或@@///)都是put _all_的合法论据。

有趣的是,_numeric__character_没有类似的捷径 - 显然这只是_all_的明确,特殊情况。没有parens就不能使用它们。 put _numeric_;给出错误_numeric_不是合法变量名称。但是,put (_numeric_) (:);完全合法。

答案 1 :(得分:1)

尝试使用冒号修饰符选项。

data _null_;
set meeting;
file 'C:\Users\Desktop\meeting2.txt' dlm=',';
put (_all_) (:);
run;

另一种选择是从SASHELP.VCOLUMN表中读取名称,创建一个列出列的宏变量,并将其包含在put语句中。

文档有点稀缺: https://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000176623.htm

  

:   使您能够指定PUT语句用于写入变量值的格式。删除所有前导和尾随空白,每个值后跟一个空格。

     

〜   使您能够指定PUT语句用于写入变量值的格式。即使格式化的值不包含分隔符,SAS也会在引号中显示格式化的值。 SAS删除所有前导和尾随空白,每个值后跟一个空白。字符变量的缺失值写为空白(“”),默认情况下,数字变量的缺失值写为句点(“。”)。

答案 2 :(得分:1)

 This is right one
    data _null_;
    set meeting;
    file 'C:\Users\Desktop\meeting2.txt' dlm=',';
    put (_all_) (~);
    run;

这个可以帮助你

答案 3 :(得分:0)

不,我' m 斯巴达克斯!

data _null_;
  set meeting;
  file 'C:\Users\Desktop\meeting2.txt' dlm=',';
  put (_all_) (&);
run;

答案 4 :(得分:0)

最简单的方法是使用变量列表后跟格式列表。语法是:

(<variable list>) (<format list>)

重复格式列表中的值,直到变量列表中的变量用尽为止。格式列表可以包括格式修饰符,如:,&amp;,〜或=和光标移动命令,如/,+ n或@n。

此外,您应该将DSD选项添加到FILE语句中,以便在CSV文件中正确表示缺失值,因为分隔符之间没有任何内容。

所以你的程序简化为:

data _null_;
  set meeting;
  file 'C:\Users\Desktop\meeting2.txt' DSD dlm=',';
  put (_all_) (:) ;
run;

你对PUT _ALL_的问题;当_ALL_本身使用时,它的处理方式与它在()中的变量列表的一部分时的处理方式不同。作为变量列表,它不包括系统生成的变量,如_N_或FIRST。或者最后。 BY语句生成的变量。

请注意,如果要在变量列表中使用_ALL_并仍然获得命名输出,则可以在格式列表中使用= format修饰符。

put (_all_) (=) ;

答案 5 :(得分:-1)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="http://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css" rel="stylesheet" />
<script src="http://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/vue/0.12.9/vue.min.js"></script>

<div id="el">
  <p>Selected: {{selected[0].country}}</p>
  <select v-select="selected[0].country" options="options">
    <option value="0">default</option>
  </select>
  
  <p>Selected: {{selected[1].country}}</p>
  <select v-select="selected[1].country" options="options">
    <option value="0">default</option>
  </select>
</div>