首页 > 解决方案 > 将(内部存在的)列标题作为第一行插入到表中

问题描述

假设我们有一个表INPUT_TABLE,它有四列namelatlonz,其中填充了许多数据集。在SAS Explorer中,它看起来像这样:

   name    lat        lon        z 
1  Germany 49.420469  8.7269178  17
2  England 51.5540693 -0.8249039 16
...

PREPROCESSED_TABLE我将基于此的 a移交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- 有人可以帮我吗?如何读出内部存储的标题名称?

标签: sas

解决方案


如果目标是创建一个包含变量名称的文件,那么只需自己编写文件。首先将名称放入数据集(按顺序),然​​后将它们写入。例如,您可以使用带有 OBS=0 数据集选项的 PROC TRANSPOSE 来生成每个变量一个观察值的文件。

 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”,而您的代码生成了单行文件“headers.txt”。然后这一步将读取并写入'PREPROCESSED_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;

推荐阅读