Sas 如何创建宏以从dataset创建JSON文件

Sas 如何创建宏以从dataset创建JSON文件,sas,Sas,我在尝试从SAS指南上的数据集生成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" "N

我在尝试从SAS指南上的数据集生成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

这条线是您的问题,它只保存最后一个数据点

  call symputx('CD_CLIENTE',CD_CLIENTE);
相反,为每个ID创建一个值,类似于创建ID的方式

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

然后稍后将其用作
&&CD\u客户&i

此行是您的问题,它将只保留最后一个数据点

  call symputx('CD_CLIENTE',CD_CLIENTE);
相反,为每个ID创建一个值,类似于创建ID的方式

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

然后在以后使用它作为
&&CD\u客户&i

我将避免生成所有那些混淆代码的宏变量

对于这种简单的格式,您可以直接编写文件,而不是使用procjson

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; 

我将避免生成所有那些混淆代码的宏变量

对于这种简单的格式,您可以直接编写文件,而不是使用procjson

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; 

是否仅导出整个文件中的两个字段?如果是这样的话,对于这种特殊情况,数据步骤可能会容易得多。这看起来不像是有效的JSON。也许您正在尝试创建一个JSONLines文件?但即使是这种格式,两个字段之间也不应该有逗号吗<代码>{“TP_SMS”:“1”、“NM_RemementESMS”:“00014578”}您是否仅导出整个文件中的两个字段?如果是这样的话,对于这种特殊情况,数据步骤可能会容易得多。这看起来不像是有效的JSON。也许您正在尝试创建一个JSONLines文件?但即使是这种格式,两个字段之间也不应该有逗号吗<代码>{“TP_SMS”:“1”,“NM_Remementesms”:“00014578”}嗨,汤姆,简单的代码解决了我的问题!非常感谢你的帮助!只是一个简单的问题:在我的文件中,我有一个容器来存放所有数据。有没有办法在容器外创建此文件?示例:{…datas1…},{…datas2…},{…datas3…},{…datas_N_…}第一个代码是手动添加方括号,所以您不能这样做。但是如果没有它们,它就不是一个有效的JSON文件!再次感谢汤姆!嗨,汤姆,简单的代码解决了我的问题!非常感谢你的帮助!只是一个简单的问题:在我的文件中,我有一个容器来存放所有数据。有没有办法在容器外创建此文件?示例:{…datas1…},{…datas2…},{…datas3…},{…datas_N_…}第一个代码是手动添加方括号,所以您不能这样做。但是如果没有它们,它就不是一个有效的JSON文件!再次感谢汤姆!