Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sas 数据步骤中的file语句以导出逗号分隔的文本文件_Sas - Fatal编程技术网

Sas 数据步骤中的file语句以导出逗号分隔的文本文件

Sas 数据步骤中的file语句以导出逗号分隔的文本文件,sas,Sas,问题:假设我不知道变量名和变量数。或者想象有太多变量我无法编写put语句。 下面的例子是我知道有3个变量 data _null_; set meeting; file 'C:\Users\Desktop\meeting2.txt' dlm=','; put region mtg sendmail; run; 我试着使用put\u all 输出为: region=N mtg=24NOV1999 sendmail=10OCT1999 _ERROR_=0 _N_=1 regi

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

下面的例子是我知道有3个变量

data _null_;
    set meeting;
    file 'C:\Users\Desktop\meeting2.txt' dlm=',';
    put region mtg sendmail;
run;
我试着使用
put\u 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
虽然它不提供分隔格式,但提供命名格式

我期望的输出是

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

尝试冒号修改器选项

data _null_;
set meeting;
file 'C:\Users\Desktop\meeting2.txt' dlm=',';
put (_all_) (:);
run;
另一个选项是从SASHELP.VCOLUMN表中读取名称,创建一个列出列的宏变量,并将其包含在put语句中

文档有点稀少:

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

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


这个能帮你

不,我是斯巴达克斯

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

你有这么多看似有效但却有不同特点的答案,原因是重要的是将
\u all
更改为
(\u all)
。之后的争论并不重要

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

put _all_;

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

put (_all_);
它失败了,并且失败了,错误提示它正在尝试调用格式化输入(即,它询问您为什么没有另一个
,这是格式化输入中在使用
()
列表之后的正常情况)


就其本身而言,
\u all
是一个专门告诉它用于输出数据集中的所有变量的函数。因此,输出的
变量=值
格式。因此在第一个示例中,
\u all
是一个常量-一个参数-仅此而已


但是,在第二个示例中,
(\u all)
是一个空格分隔的变量,它包含所有变量,就好像它们是键入的一样

put (_all_) (:);
相当于

put (name sex age height weight) (:);
如果与
SASHELP.CLASS
一起使用,添加在格式化输出上下文中合法的任何内容(冒号、波浪号、符号等)都将导致使用它

注意

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



有趣的是,
\u numeric\u
\u character\u
没有类似的快捷方式-很明显,这是一个明确的特例,只适用于
\u all\u
。没有参数就不能使用它们。
put\u numeric\u;
给出了一个错误,
\u numeric\u
不是一个合法的变量名。但是,
put(\u numeric\u)(:);
是完全合法的。

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

(<variable list>) (<format list>)
PUT _ALL_uu;的问题是,当它自己使用时,它的处理方式与作为()内部变量列表的一部分时不同。作为变量列表,它不包括系统生成的变量,如_N_u或由by语句生成的FIRST.或LAST.变量

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

put (_all_) (=) ;

是否可以在数据步骤中而不是在proc export中执行?是否有关于使用“:”的文档in put语句?冒号将其转换为
修改的列表输入
,这是有很好的文档记录的。当然,除了转换之外,它在这里并没有做任何事情-通常它允许您添加格式。然而,它在这里并没有实际修改的列表,是吗?它已经格式化了输出…所以它只是在某种程度上不做其他事情而不是用空括号防止SAS出错。是否有关于“~”用法的文档输入语句?这不是一个好的答案。虽然代码回答了问题,但除了代码之外,还应该对它的工作原理进行一些解释。P.S.如果有人能找到任何有关
&
用法的文档,请将其作为答案发布,该答案已经开放了一段时间。您是否曾在SAS-L或社区上发布过?我不会如果数据为空或其他人知道答案,我会感到惊讶。
put _all_ @;
(<variable list>) (<format list>)
data _null_;
  set meeting;
  file 'C:\Users\Desktop\meeting2.txt' DSD dlm=',';
  put (_all_) (:) ;
run;
put (_all_) (=) ;