Как создать MACRO для создания файла JSON из набора данных - PullRequest
0 голосов
/ 09 мая 2019

У меня возникают некоторые проблемы при попытке создать файл JSON из набора данных в SAS GUIDE. Я сгенерировал TEST.JSON:

{"TP_SMS":"1"  "NM_REMETENTESMS":"00000159"},
{"TP_SMS":"2"  "NM_REMETENTESMS":"00000159"},
{"TP_SMS":"3"  "NM_REMETENTESMS":"00000159"},
{"TP_SMS":"4"  "NM_REMETENTESMS":"00000159"},
{"TP_SMS":"5"  "NM_REMETENTESMS":"00000159"},
.
.
.
{"TP_SMS":"9"  "NM_REMETENTESMS":"00000159"},

Поле TP_SMS заполнено правильно, но второе поле неверно - они рассматривают только последнюю позицию из моей таблицы.

Ниже приведен мой код белого макроса:

 data teste30; 
 set MATABLES.EXIT_DATA;
 RESP=cat(CD_CLIENTE,"|",ANWER_DATA);
 ID=_N_;
 call symputx('ID',ID);
 call symputx('CD_CLIENTE',CD_CLIENTE);
 call symputx('NM_PRIMNOMECLIENTE',NM_PRIMNOMECLIENTE);
 call symputx('RESP',RESP);
 call symputx('msgtext',msgtext);
run;    



 %macro MontaJSON(ID);
 WRITE OPEN OBJECT;
    WRITE VALUES "TP_SMS" "&ID"; 
    WRITE VALUES "NM_REMETENTESMS" "&CD_CLIENTE";
 WRITE CLOSE;
 %mend MontaJSON(ID);

%macro SMSRecords;
   %do i = 1 %to &dim_IDs;
   %MontaJSON(&&&ID_&i);
%end;
%mend SMSRecords;


proc sql;
select id, CD_CLIENTE into :ID_1 - :ID_&SysMaxLong from work.teste30;
%let dim_IDs = &sqlObs;
quit;



proc json out="C:\TEMP\TEST.json" pretty nokeys nosastags;
    write open array; /* container for all the data */
    %SMSRecords;
    write close;    /* container for all the data */
run;

Я ожидаю, что этот макрос получит все данные в последовательности, как код TP_SMS:

{"TP_SMS":"1"  "NM_REMETENTESMS":"00014578"},
{"TP_SMS":"2"  "NM_REMETENTESMS":"21323445"},
{"TP_SMS":"3"  "NM_REMETENTESMS":"23456753"},
{"TP_SMS":"4"  "NM_REMETENTESMS":"00457663"},
{"TP_SMS":"5"  "NM_REMETENTESMS":"00014795"},
{"TP_SMS":"6"  "NM_REMETENTESMS":"00014566"},
{"TP_SMS":"7"  "NM_REMETENTESMS":"00014578"},
{"TP_SMS":"8"  "NM_REMETENTESMS":"00000122"},
{"TP_SMS":"9"  "NM_REMETENTESMS":"00000159"}

У кого-нибудь есть идея, чтобы решить эту проблему?

Tks

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Я бы не стал генерировать все те макропеременные, которые запутывают ваш код.

Вместо этого простого формата вы можете просто написать файл напрямую, а не использовать PROC JSON.

data _null_;
  set MATABLES.EXIT_DATA end=eof;
  file "C:\TEMP\TEST.json" ;
  if _n_=1 then put '[';
  if not eof then delim=',';
  put '{"TP_SMS":' id :$quote. ' "NM_REMETENTESMS":' CD_CLIENTE :$quote. '}' delim ;
  if eof then put ']';
run;

Или, если вы действительно обнаружите, что PROC JSON помогает, используйте аналогичный шаг данных для написания строк кода и используйте% INCLUDE для запуска сгенерированного кода.

filename code temp;
data _null_;
  set MATABLES.EXIT_DATA ;
  file code ;
  put 'WRITE OPEN OBJECT;'
    / 'WRITE VALUES "TP_SMS" ' ID :$quote. ';' 
    / 'WRITE VALUES "NM_REMETENTESMS" ' CD_CLIENTE :$quote. ';'
    / 'WRITE CLOSE;'
  ;
run;
proc json out="C:\TEMP\TEST.json" pretty nokeys nosastags;
  write open array; /* container for all the data */
  %include code;
  write close;    /* container for all the data */
run; 
1 голос
/ 09 мая 2019

Эта строка - ваша проблема, она будет содержать только последнюю точку данных.

  call symputx('CD_CLIENTE',CD_CLIENTE);

Вместо этого создайте значение для каждого идентификатора, аналогично тому, как вы создали идентификаторы.

       call symputx(catx('_', 'CD_CLIENTE', put(i, 8.-l)), CD_CLIENTE);

Затем используйте его позже как &&&CD_CLIENTE&i

...