使用 DS2 和 JSON 包时出错
Error using DS2 and JSON package
我正在尝试根据 Chris Hemedinger 的博客 post 在 SAS9.3 Maintenance 3 中使用为 proc ds2
提供的 JSON 包解析出 JSON 文件这里:
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;
我做错了什么?
根据文档 (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);
我找到了一个丑陋的解决方案,它只是调用 Form 2 以使调用明确无误。我将临界点设置为 32767,因为我正在处理 SAS 表中的数据,结果 none 无论如何都会比这更长。最终代码:
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;
我认为你是对的,这是 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;
我正在尝试根据 Chris Hemedinger 的博客 post 在 SAS9.3 Maintenance 3 中使用为 proc ds2
提供的 JSON 包解析出 JSON 文件这里:
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;
我做错了什么?
根据文档 (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);
我找到了一个丑陋的解决方案,它只是调用 Form 2 以使调用明确无误。我将临界点设置为 32767,因为我正在处理 SAS 表中的数据,结果 none 无论如何都会比这更长。最终代码:
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;
我认为你是对的,这是 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;