SAS宏变量正在变量名Proc Http中转义撇号



我已经为此工作了3天,并尝试了我能想到的所有方法,包括%str((、%bquote((、translate((和tranwrd((,用双撇号或%'替换单撇号

下面的数据步骤和宏运行良好,直到我找到一个包含撇号的姓氏,例如O'Brien。然后,由于未闭合的左括号,我会遇到语法错误。下面的代码我留下了我认为最接近于使用包含的tranwrd的代码。

非常感谢您提供的任何帮助。

%macro put_data (object1,id);
Proc http
method=“put”
url=“https://myurl/submissionid/&id”
in=&object1;
Headers “content-type”=“application/json”;
Run;
%mend;
data _null_;
Set work.emp_lis;
call execute(catt(‘%put_data(‘,’%quote(‘’{“data”:{“employeeName”:”’,tranwrd(employeeName,”’’”,”’”),’”}}’’),’,id,’)’));
run;

Craig

在SAS宏中构造或传递json字符串可能会出现大量问题。Proc JSON将从数据中(在文件中(生成有效的json,然后该文件可以被指定为web服务要使用的输入。

示例:

data have;
length id 8 name $25;
input id& name&;
datalines;
1  Homer Simpson
2  Ned Flanders
3  Shaun O'Connor
4  Tom&Bob 
5  'X Æ A-12'
6  Goofy "McDuck"
;
%macro put_data (data,id);
filename jsonfile temp;
proc json out=jsonfile;
export &data.(where=(id=&id));
write values "data";
write open object;
write values "name" name;
write close;
run;
proc http
method="put"
url="https://myurl/submissionid/&id"
in=jsonfile
;
headers "content-type"="application/json";
run;
%mend;
data _null_;
set have;
call execute(cats('%nrstr(%put_data(have,',id,'))'));
run;

我发现我的代码有问题,tranwrd语句是向后的,需要将其移到proc-sql-create-table语句中。我还需要包装&%bquote中的对象1。这是最终成功的代码。在transwrd中创建表包装变量时,如下所示。

tranwrd(employeeName,"'","''"(

% macro put_data (object1,id);
Proc http
method=“put”
url=“https://myurl/submissionid/&id”
in=%bquote(&object1);
Headers “content-type”=“application/json”;
Run;
%mend;
data _null_;
Set work.emp_lis;
call execute(catt(‘%put_data(‘,’%quote(‘’{“data”:{“employeeName”:”’,employeeName,’”}}’’),’,id,’)’));
run;

只需使用实际的引号,就不必担心宏引用。

所以,如果你的宏看起来像这样:

%macro put_data(object1,id);
proc http method="put"
url="https://myurl/submissionid/&id"
in=&object1
;
headers "content-type"="application/json";
run;
%mend;

那么OBJECT1的值通常是带引号的字符串文字或fileref。(实际上还有其他形式。(看起来你正在尝试生成一个带引号的字符串。所以只需使用QUOTE((函数。

因此,如果你的数据看起来像:

data emp_lis;
input id employeeName $50.;
cards;
1234 O'Brien
4567 Smith
;

然后,您可以使用这样的数据步骤为每个观测生成一个宏调用。

data _null_;
set emp_lis;
call execute(cats
('%nrstr(%put_data)('
,quote(cats('{"data":{"employeeName":',quote(trim(employeeName)),'}}'))
,',',id
,')'
));
run;

你的SAS日志看起来像:

NOTE: CALL EXECUTE generated line.
1    + %put_data("{""data"":{""employeeName"":""O'Brien""}}",1234)
NOTE: PROCEDURE HTTP used (Total process time):
real time           2.46 seconds
cpu time            0.04 seconds
2    + %put_data("{""data"":{""employeeName"":""Smith""}}",4567)
NOTE: PROCEDURE HTTP used (Total process time):
real time           2.46 seconds
cpu time            0.04 seconds

最新更新