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

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

我已经为此工作了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字符串时,存在大量潜在问题
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