SAS宏变量转义变量名Proc Http中的撇号
我已经为此工作了3天,并且已经尝试了所有我能想到的方法,包括%str()、%bquote()、translate()和tranwrd(),将单撇号替换为双撇号或%' 下面的数据步骤和宏工作正常,直到我找到一个包含撇号的姓氏,例如O'Brien。然后,由于左括号未闭合,我遇到了语法错误。下面的代码是我认为最接近tranwrd的代码 非常感谢您提供的任何帮助SAS宏变量转义变量名Proc Http中的撇号,sas,sas-macro,Sas,Sas Macro,我已经为此工作了3天,并且已经尝试了所有我能想到的方法,包括%str()、%bquote()、translate()和tranwrd(),将单撇号替换为双撇号或%' 下面的数据步骤和宏工作正常,直到我找到一个包含撇号的姓氏,例如O'Brien。然后,由于左括号未闭合,我遇到了语法错误。下面的代码是我认为最接近tranwrd的代码 非常感谢您提供的任何帮助 %macro put_data (object1,id); Proc http method=“put” url=“https://myurl
%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字符串时,存在大量潜在问题
procjson
将从数据中生成有效的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语句是向后的,需要将它移到procsqlcreatetable语句中。我还需要在%bquote中包装&object1。这是最后一个有效的代码。 在tranwrd中创建表换行变量时,如下所示 tranwrd(员工姓名,“,”)
只要使用实际的引号,您就不必担心宏引号 因此,如果您的宏如下所示:
%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
嗨,Richard,感谢您的及时回复和非常翔实的信息/代码。我发现代码中的问题是我的tranwrd语句是向后的,需要将它移到表创建过程sql中。此外,我还需要将我的&object1包装在%bquote中。我将很快上传。感谢您的反馈和帮助。请显示输入值。请显示适用于不带任何宏或宏变量的
O'Brien
值的SAS代码。为什么不使用QUOTE()而不是TRANWRD()来处理包含引号的引用值?您发布的代码具有“智能”引号,而不是普通的单引号”
或双引号“
字符。这就是造成你麻烦的原因吗?
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