如何在 SAS 中连接格式化值
How to concatenate formatted values in SAS
我正在使用 sas 使用我制作的宏以 JSON 格式导出数据:
%macro json4datatables(ds,path,file,charvars,numvars)
/ store source
DES="json4datatables(ds,path,file,charvars,numvars)";
/* creates a json with no headers
* a bit like a csv without the first line
* it takes thus less space
* but you have to know which column is what
*/
data _null_;
length line 0;
set &ds nobs=nobs end=end;
file "&path.&file." encoding='utf-8' bom/**/ ;
line = '[';
%if &charvars ne %then %do;
%do i=1 %to %sysfunc(countw(&charvars));
%let charvar = %scan(&charvars, &i);
%if &i ne 1 %then %do;
line = cats(line,',');
%end;
line = cats(line,'"',&charvar,'"');
%end;
%end;
%if &numvars ne %then %do;
%do i=1 %to %sysfunc(countw(&numvars));
%let numvar = %scan(&numvars, &i);
%if &i ne 1 OR &charvars ne %then %do;
line = cats(line,',');
%end;
line = cats(line,'',&numvar,'');
%end;
%end;
line = cats(line,']');
if _n_=1 then put '{"data": [';
if not end then put line +(-1) ',';
else do;
put line;
put ']}';
end;
run;
%mend json4datatables;
但我的问题是导出原始值。
我想导出格式化值。
我怎样才能做到这一点?
我在想也许有一个函数允许连接格式化值而不是值,我可以用它替换 cats()。
谢谢!
VVALUE 可能是您正在寻找的功能,但它不会取代 CATS。也可用于引用使用 QUOTE 函数。
使用VVALUE()
函数。
line = cats(line,'',vvalue(&numvar),'');
另外,为什么不直接使用 CATX()
函数呢?替换
%if &i ne 1 OR &charvars ne %then %do;
line = cats(line,',');
%end;
line = cats(line,'',vvalue(&numvar),'');
和
line = catx(',',line,vvalue(&numvar));
对于字符值,使用 QUOTE()
函数。
line = catx(',',line,quote(cats(vvalue(&charvar))));
将添加的方括号移至末尾。
line = cats('[',line,']');
您可以使用 put
、putc
或 putn
函数打印带有格式的值,要获得格式使用 vformat function
,但是当您使用 vformat function
只有 putn
和 putc
支持它。
line = cats(line,'"',putc(&charvar, vformat(&charvar)),'"');
line = cats(line,'',putn(&numvar, vformat(&numvar)),'');
我正在使用 sas 使用我制作的宏以 JSON 格式导出数据:
%macro json4datatables(ds,path,file,charvars,numvars)
/ store source
DES="json4datatables(ds,path,file,charvars,numvars)";
/* creates a json with no headers
* a bit like a csv without the first line
* it takes thus less space
* but you have to know which column is what
*/
data _null_;
length line 0;
set &ds nobs=nobs end=end;
file "&path.&file." encoding='utf-8' bom/**/ ;
line = '[';
%if &charvars ne %then %do;
%do i=1 %to %sysfunc(countw(&charvars));
%let charvar = %scan(&charvars, &i);
%if &i ne 1 %then %do;
line = cats(line,',');
%end;
line = cats(line,'"',&charvar,'"');
%end;
%end;
%if &numvars ne %then %do;
%do i=1 %to %sysfunc(countw(&numvars));
%let numvar = %scan(&numvars, &i);
%if &i ne 1 OR &charvars ne %then %do;
line = cats(line,',');
%end;
line = cats(line,'',&numvar,'');
%end;
%end;
line = cats(line,']');
if _n_=1 then put '{"data": [';
if not end then put line +(-1) ',';
else do;
put line;
put ']}';
end;
run;
%mend json4datatables;
但我的问题是导出原始值。
我想导出格式化值。
我怎样才能做到这一点?
我在想也许有一个函数允许连接格式化值而不是值,我可以用它替换 cats()。
谢谢!
VVALUE 可能是您正在寻找的功能,但它不会取代 CATS。也可用于引用使用 QUOTE 函数。
使用VVALUE()
函数。
line = cats(line,'',vvalue(&numvar),'');
另外,为什么不直接使用 CATX()
函数呢?替换
%if &i ne 1 OR &charvars ne %then %do;
line = cats(line,',');
%end;
line = cats(line,'',vvalue(&numvar),'');
和
line = catx(',',line,vvalue(&numvar));
对于字符值,使用 QUOTE()
函数。
line = catx(',',line,quote(cats(vvalue(&charvar))));
将添加的方括号移至末尾。
line = cats('[',line,']');
您可以使用 put
、putc
或 putn
函数打印带有格式的值,要获得格式使用 vformat function
,但是当您使用 vformat function
只有 putn
和 putc
支持它。
line = cats(line,'"',putc(&charvar, vformat(&charvar)),'"');
line = cats(line,'',putn(&numvar, vformat(&numvar)),'');