Преобразование набора данных SAS в текстовый файл с разделителями каналов с двойной кавычкой для текстовых атрибутов - PullRequest
1 голос
/ 03 марта 2020

Я нашел макрос для преобразования набора данных SAS в текстовый файл с разделителями в виде трубы с двойной кавычкой для текстовых атрибутов, но не смог понять, как добавить имя / заголовок атрибута в текстовый файл. Ценю любую помощь, которую вы можете предложить. ниже приведен макрос, сгенерированный текстовый файл (с разделителем в виде двойных кавычек для текстовых атрибутов) без имени атрибута.

%macro csvQuoteChars(lib=,dset=,outPath=);
proc contents data=&lib..&dset out=vars(keep=name varnum type);

 run;
proc sql print;
    select (strip(name)) into :vars separated by '|' from vars
    order by varnum;
quit;

 %let dsid = %sysfunc(open(vars));
 %let nobs = %sysfunc(attrn(&dsid,nlobs));

 data _null_;
  set &lib..&dset;
  file "&outPath\&lib..&dset..txt" dsd dlm='|';

  %do i=1 %to &nobs;
      %let rc = %sysfunc(fetchobs(&dsid,&i));
      %let vName = %sysfunc(getvarc(&dsid,1));
      %let vType = %sysfunc(getvarn(&dsid,2));
      %put &=vName &=vType;

      %if &vType = 2 %then %do;
          put (&vName) (~) @;
      %end;
      %else %if &vType = 1 %then %do;
          put &vName @;
      %end;

      %if &i = &nobs %then %do;
          put ;
      %end;

  %end;

 run;

 %let dsid = %sysfunc(close(&dsid));

%mend csvQuoteChars;
%csvQuoteChars(lib=ed,dset=stopoverchg_201709,outPath=d:\temp);

Ответы [ 3 ]

1 голос
/ 03 марта 2020

SAS сделает это по умолчанию для значений, которые содержат разделитель, поэтому вам не нужно вводить все символьные значения, если это не является обязательным условием. Тем не менее, это будет экспортировать файл правильно.

data class;
set sashelp.class;
if name='Alfred' then name = 'Al|fred';
run;

proc export data=class outfile='/folders/myfolders/class.txt'    dbms=dlm replace;
delimiter='|';
run;
0 голосов
/ 03 марта 2020

Вы слишком усложнили задачу генерации кода. Вам просто нужно сгенерировать оператор put, например:

put name ~ sex ~ age height weight ;

Так что создайте макропеременные, чтобы помочь с этим. Вы также можете сделать информацию, необходимую для заголовков. Я предполагаю, что вы также хотите кавычки вокруг значений заголовка. Включите VARNUM в список выбора, чтобы избежать предупреждения PRO C SQL о сортировке по невыбранному значению.

proc sql noprint;
select varnum
     , quote(trim(name))
     , catx(' ',name,case when (type=2) then '~' else ' ' end)
into :dummy
   , :headers separated by '|'
   , :varlist separated by ' '
from vars
order by varnum
;
quit;

Тогда ваш шаг для записи данных будет следующим:

data _null_;
  set &lib..&dset;
  file "&outPath\&lib..&dset..txt" lrecl=2000000 dsd dlm='|';
  if _n_=1 then put %sysfunc(quote(&headers),%str(%')) ;
  put &varlist;
run;
0 голосов
/ 03 марта 2020

Export на @Reeza намного проще.

Макрос можно изменить, чтобы также выводить строку заголовка с именами переменных. Макрос заполняет макропеременную vars списком имен переменных с разделителями, а затем никогда не использует его.

Добавьте эту строку в оператор data _null_ после file:

if _n_ = 1 then put "&vars";
...