我正在尝试使用在SAS9.3维护3中为proc ds2
提供的JSON包来解析一个JSON文件,根据Chris Hemedinger的博客文章:
http://blogs.sas.com/content/sasdummy/2015/09/28/parse-json-from-sas/
在重新开始我的SAS会话之前,一切似乎都运转正常,现在我继续收到消息:
ERROR: Compilation error.
ERROR: Line 883: Ambiguous method call for method createparser. Multiple method declarations
match the given argument list.
第883行(在本例中)是指包含createParser
调用的行。这是一些可以重现错误的简化代码:
data have;
set sashelp.class;
run;
proc ds2;
data want;
dcl package json j();
dcl int rc;
method run();
set have;
rc = j.createParser( name );
end;
enddata;
run;
quit;
我做错了什么?
答案 0 :(得分:1)
根据文档(https://support.sas.com/documentation/cdl/en/ds2ref/68052/HTML/default/viewer.htm#n1w9ms65zrao57n1p1yt4029jcwt.htm),他们在createParser上使用方法重载。有4种方法可供选择,似乎SAS无法分辨出我试图调用的4个中的哪一个:
表格1:
package.CREATEPARSER ( );
表格2:
package.CREATEPARSER (json-text, tipping-size);
表格3:
package.CREATEPARSER (json-text);
表格4:
package.CREATEPARSER (tipping-size);
我找到了一个丑陋的解决方案,只需调用表单2即可使调用明确无误。我将引爆点设置为32767,因为我正在使用SAS表中的数据,并且结果都不会比这更长。最终代码:
proc ds2;
data want (overwrite=yes);
dcl package json j();
dcl int rc;
method init();
set have;
rc = j.createParser( name , 32767 );
end;
enddata;
%runquit;
答案 1 :(得分:1)
我认为你是对的,这是SAS的一个错误,我不认为有一种方法可以向SAS证实你使用方法3而不是方法4.只需声明name
由于某些原因,角色不够。我会建议用SAS为这张票买票。
但是,我认为方法1优于方法2,因为您并不真正想要指定小费大小。只需将其移至INIT(无论如何它都属于)并使用setparserinput
,如documentation中所述:
data have;
set sashelp.class;
run;
proc ds2;
data want;
dcl package json j();
dcl double rc;
method init();
rc = j.createParser();
j.setParserInput(name);
end;
method run();
set have;
end;
enddata;
run;
quit;
此外,看起来该示例的工作原因是character set
参数。 UTF-8
或Unicode
将起作用(后者实际上不会因其他原因而工作,但不会因此原因而中断),而WLatin1
,{{1 }}或ANSI
不会。显然将其设置为UTF-8字符会导致SAS意识到它的真正特征吗?
ASCII