SAS записывает файл с использованием строки переменных с удержанием строки и циклом - PullRequest
0 голосов
/ 22 марта 2012

Я пытаюсь записать файл, используя некоторые переменные, хранящиеся во внешнем файле. У меня проблемы с использованием держателя строки (@@ с оператором 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;

& totaln. общее количество в объединенном файле, который я сделал. «Объединенный» содержит переменные a, b, c, av, ab, ac (их строк около 19). Поэтому я хочу, чтобы 19 строк переменных a, b, c находились ниже линии NE totaln. И затем то же самое для av, bv, cv под линией итоговой линии OL, затем три линии строк 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,12661198 0,1685302022 6

внешний вид:
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
ПР 6
1 L3 2 DW 1,7 0,9620294118 -2,137070959 0,031533299
2 L3 2 DW 1,7 0,7738647059 -1,185638164 0,3506849035
3 L3 2 DW 1,7 1,7611941176 -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 АО
OP
КО SL

1 Ответ

1 голос
/ 22 марта 2012

Чтобы разделить данные, установите середину (по существу) и поместите 3 левые переменные над 3 правыми переменными в выходной файл ... вам нужно 2 шага данных.Я разделил переменные на 2 набора данных.После создания выходного файла с первыми 3-мя переменными его можно снова записать с помощью опции MOD в операторе FILE.Возможно, вам нужно настроить некоторые из ваших мест размещения @, чтобы переменные совпали по столбцам.Кроме того, в этом примере кажется, что «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;
...