假设我们有一个表INPUT_TABLE
,其中有四列name
、lat
、lon
和z
,其中填充了许多数据集。例如,在SAS 中,如下所示:
name lat lon z
1 Germany 49.420469 8.7269178 17
2 England 51.5540693 -0.8249039 16
...
我将基于此PREPROCESSED_TABLE
的INPUT_TABLE
切换到宏%tabl
data V42.PREPROCESSED_TABLE;
set V21.INPUT_TABLE;
drop NAME;
run;
%tabl(libin=V42, file=PREPROCESSED_TABLE);
宏本身是不允许修改的。
除其他外,%tabl
还编写了一个纯文本文件PREPROCESSED_TABLE.txt
。
49.420469|8.7269178|17
51.5540693|-0.8249039|16
我也希望把标题名称写出来,例如:
lat|lon|z
49.420469|8.7269178|17
51.5540693|-0.8249039|16
我的想法是将PREPROCESSED_TABLE
扩展到data
步骤的某个地方--有人能帮我吗?如何读出内部存储的标头名称?
发布于 2020-07-09 04:20:23
考虑到Reeza和Tom的提示,我自己想出了一个解决办法:我们简单地调用宏%tabl
两次,一次是使用带有列名的1行表,一次是使用数据。这种方法本质上相当于先将头附加到文件中,然后再将数据附加到文件中(只不过我需要担心%tabl
在流程链中进一步添加的其他内容)。
我遇到的技术困难是如何从表输入表V21.INPUT_TABLE
的元信息中提取这个列名为1行的表。
我的队友教我怎么做的。为了使它对每个人都是可测试的,我将为测试数据表sashelp.class
演示这个步骤
proc contents data=sashelp.class out=meta (keep=NAME VARNUM) noprint;
run;
proc sort data=meta out=meta2;
by VARNUM;
run;
proc transpose data=meta2 out=colheaders (drop=_NAME_ _LABEL_);
var name;
run;
因此,我们将有一个表colheaders
,它只有一行包含表标题,按VARNUM
排序,这是它们在原始表中出现的顺序:
COL1 COL2 COL3 COL4 COL5
1 NAME SEX AGE HEIGHT WEIGHT
问题解决了,至少在理论上是这样。
发布于 2020-07-09 06:18:15
如果目标是创建一个带有变量名的一行文件,那么只需自己编写该文件即可。首先将名称放入数据集(按顺序排列),然后编写它们。例如,您可以使用PROC TRANSPOSE OBS=0 dataset选项来生成一个文件,每个变量只有一个观察。
proc transpose data=V42.PREPROCESSED_TABLE(obs=0) out=NAMES ;
var _all_ ;
run;
然后您可以使用它来写入文件。
data _null_;
set names ;
file 'preprocessed.txt' dsd dlm='|';
put _name_ @ ;
run;
如果还想将数据添加到同一个文件中,只需使用第二个数据步骤即可。确保在file语句上使用MOD选项,以便将数据行附加到现有文件中。
data _null_;
set V42.PREPROCESSED_TABLE;
file 'preprocessed.txt' dsd dlm='|' mod;
put (_all_) (+0);
run;
如果由于其他原因需要调用现有宏,则可以忽略它创建的文件。或者,如果由于某些原因,内容与文件的简单转储不同,那么您可以将文件与宏生成的文件的头连接起来。假设宏生成'PREPROCESSED_TABLE.txt‘,代码生成一行文件’file ers.txt‘。然后,这个步骤将同时读取并写入‘预处理_TABLE_w_Headers.txt’;
data _null_;
file 'PREPROCESSED_TABLE_w_headers.txt';
if _n_=1 then do;
infile 'headers.txt';
input;
put _infile_;
end;
infile 'PREPROCESSED_TABLE.txt';
input;
put _infile_;
run;
https://stackoverflow.com/questions/62804507
复制相似问题