SAS使用带有行保持和循环的变量行写入文件

时间:2012-03-22 10:10:25

标签: sas

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

这是我写的代码:

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;

&安培; totaln。是我制作的合并文件中的总计数。 '合并'包含a,b,c,av,ab,ac变量(它们的行大约是19个)。所以我想要19行a,b,c变量低于NE totaln line。然后对于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

outfille look:
NE 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
OP
KO SL

1 个答案:

答案 0 :(得分: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;