我正在尝试使用为 SAS9.3 Maintenance 3 中的 proc ds2
提供的 JSON 包解析 JSON 文件,根据 Chris Hemedinger 的博客文章:
http://blogs.sas.com/content/sasdummy/2015/09/28/parse-json-from-sas/
在我重新启动 SAS session 之前一切似乎都运行良好,现在我不断收到消息:
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;
我做错了什么?
最佳答案
我认为你是对的,这是 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
、ANSI
或 ASCII
不会。显然将其设置为 UTF-8 字符会导致 SAS 意识到它确实是字符?
data have;
set sashelp.class;
run;
proc ds2;
data want(overwrite=yes);
dcl package json j();
dcl char(50) character set utf8 name;
dcl double rc;
method init();
rc = j.createParser( name );
end;
method run();
set have;
end;
enddata;
run;
quit;
关于json - 使用 DS2 和 JSON 包时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878657/