Error al usar el paquete DS2 y JSON
sas sas-ds2 (2)
Estoy tratando de analizar un archivo JSON usando el paquete JSON provisto para proc ds2
en SAS9.3 Maintenance 3 de acuerdo con la publicación del blog de Chris Hemedinger aquí:
http://blogs.sas.com/content/sasdummy/2015/09/28/parse-json-from-sas/
Todo parecía funcionar bien hasta que reinicié mi sesión SAS y ahora sigo recibiendo el mensaje:
ERROR: Compilation error.
ERROR: Line 883: Ambiguous method call for method createparser. Multiple method declarations
match the given argument list.
La línea 883 (en este caso) se refiere a la línea que contiene la llamada createParser
. Aquí hay un código simplificado que puede reproducir el error:
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;
¿Qué estoy haciendo mal?
Creo que tienes razón en que esto es un error de SAS, y desafortunadamente no veo una forma de confirmarle a SAS que estás utilizando el método 3 y no el método 4. Simplemente declarar el name
como personaje no es suficiente, por alguna razón. Traer un boleto con SAS para esto, sugeriría.
Sin embargo, creo que el método 1 es mejor que el método 2 aquí, dado que realmente no desea especificar el tamaño de inclinación. Simplemente mueva esto a INIT (donde pertenece de todos modos) y use setparserinput
, como se sugiere en la documentación :
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;
Además, parece que la razón por la que el ejemplo funciona es el argumento del character set
. UTF-8
o Unicode
funcionarán (este último no funcionará por otras razones pero no se romperá por este motivo), mientras que WLatin1
, ANSI
o ASCII
no funcionarán. Al parecer, establecerlo como un personaje UTF-8 hace que SAS se de cuenta de que es realmente el personaje?
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;
De acuerdo con la documentación ( https://support.sas.com/documentation/cdl/en/ds2ref/68052/HTML/default/viewer.htm#n1w9ms65zrao57n1p1yt4029jcwt.htm ) utilizan la sobrecarga de métodos en createParser. Hay 4 métodos para elegir y parece que de alguna manera SAS no puede decir cuál de los 4 estoy tratando de llamar:
Formulario 1:
package.CREATEPARSER ( );
Forma 2:
package.CREATEPARSER (json-text, tipping-size);
Formulario 3:
package.CREATEPARSER (json-text);
Forma 4:
package.CREATEPARSER (tipping-size);
Encontré una solución fea que es simplemente llamar al Formulario 2 para que la llamada no sea ambigua. Establecí el punto de inflexión en 32767 ya que estoy trabajando con datos en tablas SAS y ninguno de los resultados será más largo que eso de todos modos. Código final:
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;