【问题标题】:SAS writing file using variables line with line holding and loopSAS使用带有行保持和循环的变量行写入文件
【发布时间】:2012-03-22 10:10:25
【问题描述】:

我正在尝试使用存储在外部文件中的一些变量来编写文件。我在使用 line holder(@@ with put 语句)和循环时遇到问题。我喜欢将变量放在文件中的某些位置,但是我得到的结果文件在这些变量的每一行中重复。我只是希望将这些变量作为一个块一次性放置。

这是我写的代码:

data _null_;
 set merged;
 file 'c:outfile.txt';
 put @1 "A" @4 &totaln.;
 do i=1 to &totaln;  
  put @1 i @4 "L3 2 DW 1.7" @17 a @28 b @40 c @@;
 end;   
 put;
 put @1 "OL" @4 &totaln.;
 do j=1 to &totaln.;
  put @1 j put @4 "L3 2 DW 1.7" put @17 av @28 bv @40 cv @@;
 end;
 put;
 put    @1 "CI &totaln. AO";
 put    @1 "OP";
 put    @1 "KO" @4 "SL";
run;

&总数。是我制作的合并文件中的计数总数。 'Merged' 包含 a、b、c、av、ab、ac 变量(它们的行大约有 19 个)。所以我想要 NE totaln 行下方的 19 行 a、b、c 变量。然后 av, bv, cv 在 OL totaln 行以下,然后是 outfile 末尾的 CI OP 和 Ko 行这三行。

合并:

A B C av bv ac cnt
0.0268 676.9155 0.0347 0.9620294118 -2.131070959 0.031533299 1
0.0215 704.6740 0.2240 0.7738647059 -1.185638164 0.3506849035 2
0.0430 736.3752 0.2053 1.5611941176 -0.442240668 0.2434476134 3
0.0223 727.6945 0.1752 0.8075882353 -0.833957317 0.1725987826 4
0.0220 715.3714 0.1187 0.7434058824 -0.991003252 0.120438949 5
0.0287 754.1052 0.1824 0.8567470588 0.126161198 0.1685302022 6

填充外观:
东北 6
1 L3 2 DW 1.7 0.0268 676.9155 0.0347
2 L3 2 DW 1.7 0.0215 704.6740 0.2240
3 L3 2 DW 1.7 0.0430 736.3752 0.2053
4 L3 2 DW 1.7 0.0223 727.6945 0.1752
5 L3 2 DW 1.7 0.0220 715.3714 0.1187
6 L3 2 DW 1.7 0.0287 754.1052 0.1824
OL 6
1 L3 2 DW 1.7 0.9620294118 -2.131070959 0.031533299
2 L3 2 DW 1.7 0.7738647059 -1.185638164 0.3506849035
3 L3 2 DW 1.7 1.5611941176 -0.442240668 0.2434476134
4 L3 2 DW 1.7 0.8075882353 -0.833957317 0.1725987826
5 L3 2 DW 1.7 0.7434058824 -0.991003252 0.120438949
6 L3 2 DW 1.7 0.8567470588 0.126161198 0.1685302022
CI 6 AO
欧普
KO SL

【问题讨论】:

  • 您需要从 MERGED 发布数据。此外,每个 PUT 语句都需要一个分号......在您的 DO-END 中,您在同一行上有多个 put 语句。我怀疑任何人都可以在没有看到一些示例成功输出的情况下解决这个问题。发布输入数据以及您希望它的外观。

标签: sas


【解决方案1】:

为了将数据集从中间拆分(基本上)并将左侧 3 个变量放在输出文件中右侧 3 个变量的上方...您需要 2 个数据步骤。我将变量分成 2 个数据集。使用第一个 3 个变量创建输出文件后,可以使用 FILE 语句上的 MOD 选项再次将其写入。您可能需要调整一些 Put @ 位置以使变量与列对齐。此外,在此示例中,“L3 2 DW 1.7”似乎是一个常数,将其放入宏变量中,以便只需要在一个位置进行更改。

试试这个:

proc sql;
select count(*) into:totaln
from merged;
quit;

data merged1(keep=cnt a b c) merged2(keep=cnt av bv ac);
 input A B C av bv ac cnt;
 datalines;
 0.0268 676.9155 0.0347 0.9620294118 -2.131070959 0.031533299 1
 0.0215 704.6740 0.2240 0.7738647059 -1.185638164 0.3506849035 2
 0.0430 736.3752 0.2053 1.5611941176 -0.442240668 0.2434476134 3
 0.0223 727.6945 0.1752 0.8075882353 -0.833957317 0.1725987826 4
 0.0220 715.3714 0.1187 0.7434058824 -0.991003252 0.120438949 5
 0.0287 754.1052 0.1824 0.8567470588 0.126161198 0.1685302022 6 
 ;
run;

data _null_;
 set merged1;
 file "C:\outfile.txt";
 if _n_=1 then put @1 "NE" @4 "&totaln";
 put @1 cnt @4 "L3 2 DW 1.7" @17 a @28 b @40 c;
run;

data _null_;
 set merged2 end=last;
 file "C:\outfile.txt" mod;
 if _n_=1 then put @1 "OL" @4 "&totaln";
 put @1 cnt put @4 "L3 2 DW 1.7" put @17 av @28 bv @40 ac;
 if last then do;
  put    @1 "CI &totaln. AO";
  put    @1 "OP";
  put    @1 "KO" @4 "SL";
 end;
run;

【讨论】:

  • 感谢你十亿CarolinaJay!它工作得很好。然后除了你的之外,我只是在“合并”中使用 proc sql 将 totaln 作为宏变量,而不是使用 let 宏语句。非常感谢!!
  • 但现在使用宏变量 totaln 无法正常工作。是否必须仅使用 %let 语句才能使用总 n 计数?
  • 不,您当然可以使用 SQL 创建宏变量。在您的问题中发布您的 SQL 代码。
  • proc sql;从合并中选择 count(*) into:totaln;退出;但它给出了总数,但不在右栏中。
  • totaln 超出指定列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多