是否有一种通用的方式将观察中的每个变量连接为一个更大的变量,同时保留在数据集上进行proc打印时其外观的数字/货币字段格式。 (例如,参见sashelp.shoes)
这是您可以运行的一些代码,正如您在查看日志时所看到的那样,使用catx函数生成逗号分隔的输出会从数字变量中删除$货币符号和句点
proc print data=sashelp.shoes (obs=10);
run;
proc sql;
select name into :varstr2 separated by ','
from dictionary.columns
where libname = "SASHELP" and
memname = "SHOES";
quit;
data stuff();
format all $5000.;
set sashelp.shoes ;
all = catx(',',&varstr2.) ;
put all;
run;
任何解决方案都需要通用,因为它可以在格式不同的变量的不同数据集上运行。
答案 0 :(得分:1)
具有vvalue和concat函数(||)的解决方案:
它与“没有catx的解决方案”(最后一个)类似,但是通过 vvalue 函数而不是 put 进行了简化。
flask.
catx解决方案:
sklearn.
如果没有/*edit sashelp.shoes with missing values in Product as test-cases*/
proc sql noprint;
create table wocatx as
select * from SASHELP.SHOES;
update wocatx
set Product = '';
quit;
/*Macro variable for concat function (||)*/
proc sql;
select ('strip(vvalue('|| strip(name) ||'))') into :varstr4 separated by "|| ',' ||"
from dictionary.columns
where libname = "WORK" and
memname = "WOCATX";
quit;
/*Data step to concat all variables*/
data stuff2;
format all $5000.;
set work.wocatx ;
all = &varstr4. ;
put all;
run;
格式,则在宏变量varstr2中仅会命名,如果有格式,则在调用catx时它将以格式转换,例如,您需要如果变量为num类型,则为proc print data=SASHELP.SHOES;
run;
proc sql;
select ifc(strip(format) is missing,strip(name),ifc(type='num','put('|| strip(name) ||','|| strip(format) ||')','input('|| strip(name) ||','|| strip(format) ||')')) into :varstr2 separated by ','
from dictionary.columns
where libname = "SASHELP" and
memname = "SHOES";
quit;
data stuff();
format all $5000.;
set sashelp.shoes ;
all = catx(',',&varstr2.) ;
put all;
run;
;如果为char类型,则为dictionary.columns
函数。您可以根据需要在put(Sales,DOLLAR12.)
中添加任何条件。
如果不需要使用input
函数,只需更改选择:
select into
没有catx的解决方案:
input
具有catx和缺失值的结果:
不含catx和缺少值的结果:
答案 1 :(得分:1)
您可以使用导入和导出到csv文件:
filename tem temp;
proc export data=sashelp.SHOES file=tem dbms=csv replace;
run;
data l;
length all $ 200;
infile tem truncover firstobs=2;
input all 1-200;
run;
P.S。 如果只需要串联char,则uou可以创建数据集中所有CHARACTER列的数组,然后遍历:
data l;
length all $ 5000;
set sashelp.SHOES;
array ch [*] _CHARACTER_;
do i = 1 to dim(ch);
all=catx(',',all,ch[i]);
end;
run;
答案 2 :(得分:0)
PUT
语句是最简单的方法。您无需知道变量名称,就可以使用_all_
变量列表。
put (_all_) (+0);
它将采用变量附带的格式,如果您在FILE语句中使用了DSD选项,则结果为定界列表。
此练习的最终目标是什么?如果要创建文件,则可以直接写该文件。
data _null_;
set sashelp.shoes(obs=3);
file 'myfile.csv' dsd ;
put (_all_) (+0);
run;
如果您确实想将该字符串放入数据集变量中,则无需发明一些新功能。通过创建一个文件,然后从文件中读取各行,只需利用PUT
语句功能即可。
filename junk temp;
data _null_;
set sashelp.shoes(obs=3);
file junk dsd ;
put (_all_) (+0);
run;
data stuff ;
set sashelp.shoes(obs=3);
infile junk truncover ;
input all $5000.;
run;
您甚至可以在不创建全文文件的情况下进行操作。而是一次只写一行,然后使用_FILE_
自动变量将行保存到变量中。
filename junk temp;
data stuff;
set sashelp.shoes(obs=3);
file junk dsd lrecl=5000 ;
length all $5000;
put @1 (_all_) (+0) +(-2) ' ' @;
all = _file_;
output;
all=' ';
put @1 all $5000. @;
run;
答案 3 :(得分:0)
您可以手动循环数据集的PDV变量,并用vvaluex
连接检索到的每个格式化值。散列可用于跟踪要处理的数据集中的哪些变量。如果您要用逗号分隔值,则可能需要用双引号将包含逗号的格式值括起来。
data want;
set sashelp.cars indsname=_data;
if _n_ = 1 then do;
declare hash vars();
length _varnum 8 _varname $32;
vars.defineKey('_n_');
vars.defineData('_varname');
vars.defineDone();
_dsid = open(_data);
do _n_ = 1 to attrn(_dsid,'NVAR');
rc = vars.add(key:_n_,data:varname(_dsid,_n_));
end;
_dsid = close(_dsid);
call missing (of _:);
end;
format weight comma7.;
length allcat $32000 _vvx $32000;
do _n_ = 1 to vars.NUM_ITEMS;
vars.find();
_vvx = strip(vvaluex(_varname));
if index(_vvx,",") then _vvx = quote(strip(_vvx));
if _n_ = 1
then allcat = _vvx;
else allcat = cats(allcat,',',_vvx);
end;
drop _:;
run;