如何创建MACRO以从数据集创建JSON文件

时间:2019-05-08 22:21:51

标签: sas

当我尝试从SAS GUIDE上的数据集生成JSON文件时遇到一些问题。我生成了一个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 个答案:

答案 0 :(得分:1)

这是您的问题,它将仅保留最后一个数据点。

  call symputx('CD_CLIENTE',CD_CLIENTE);

相反,为每个ID创建一个值,类似于创建ID的方式。

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

然后将其用作&&&CD_CLIENTE&i

答案 1 :(得分:1)

我将避免生成所有会使您的代码混乱的宏变量。

对于这种简单格式,您可以直接编写文件,而无需使用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;