Configuración del tipo de datos al leer datos XML en SAS
Pregunta
Necesito controlar el tipo de datos cuando leo datos XML en SAS. Los datos XML se escriben y se accede a ellos utilizando el motor de libname XML en SAS.
SAS parece adivinar el tipo de datos según el contenido de una columna: si escribo " 20081002 " a mis datos XML en una columna de caracteres, se volverá a leer como una variable numérica.
Un ejemplo:
filename my_xml '/tmp/my.xml'; * Yes, I use SAS on Unix *;
libname my_xml XML;
data my_xml.data_type_test;
text_char="This is obviously text";
date_char="20081002";
num_char="42";
genuine_num=42;
run;
proc copy inlib=my_xml outlib=WORK;
run;
libname my_xml;
filename my_xml CLEAR;
Solo la última columna se define como tipo de datos numéricos en los datos XML, pero cuando la copio en mi biblioteca WORK, solo la columna text_char tiene carácter. Los otros 3 son ahora numéricos.
¿Cómo puedo controlar el tipo de datos cuando leo datos XML en SAS?
Solución
Eche un vistazo al SAS XML Mapper. Le permite crear un mapa para leer (y escribir en 9.2) archivos XML y especificar atributos de columna.
Si este es su archivo XML:
Esto obviamente es texto 20081002 42 42 Podrías crear un MAP como este:
<!-- ############################################################ -->
<TABLE name="DATA_TYPE_TEST">
<TABLE-PATH syntax="XPath">/TABLE/DATA_TYPE_TEST</TABLE-PATH>
<COLUMN name="text_char">
<PATH syntax="XPath">/TABLE/DATA_TYPE_TEST/text_char</PATH>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>22</LENGTH>
</COLUMN>
<COLUMN name="date_char">
<PATH syntax="XPath">/TABLE/DATA_TYPE_TEST/date_char</PATH>
<TYPE>numeric</TYPE>
<DATATYPE>integer</DATATYPE>
<FORMAT width="9">DATE</FORMAT>
<INFORMAT width="8">ND8601DA</INFORMAT>
</COLUMN>
<COLUMN name="num_char">
<PATH syntax="XPath">/TABLE/DATA_TYPE_TEST/num_char</PATH>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>2</LENGTH>
</COLUMN>
<COLUMN name="genuine_num">
<PATH syntax="XPath">/TABLE/DATA_TYPE_TEST/genuine_num</PATH>
<TYPE>numeric</TYPE>
<DATATYPE>integer</DATATYPE>
</COLUMN>
</TABLE>
Y luego lea el archivo XML:
filename my 'C:\temp\my.xml';
filename SXLEMAP 'C:\temp\MyMap.map';
libname my xml xmlmap=SXLEMAP access=READONLY;
title 'Table DATA_TYPE_TEST';
proc contents data=my.DATA_TYPE_TEST varnum;
run;
proc print data=my.DATA_TYPE_TEST(obs=10);
run;
Resultado:
Table DATA_TYPE_TEST
The CONTENTS Procedure
Data Set Name MY.DATA_TYPE_TEST Observations
Member Type DATA Variables 4
Engine XML Indexes 0
Created . Observation Length 0
Last Modified . Deleted Observations 0
Protection Compressed NO
Data Set Type Sorted NO
Label
Data Representation Default
Encoding Default
Variables in Creation Order
# Variable Type Len Format Informat Label
1 text_char Char 22 $22. $22. text_char
2 date_char Num 8 DATE9. ND8601DA8. date_char
3 num_char Char 2 $2. $2. num_char
4 genuine_num Num 8 F8. F8. genuine_num
Table DATA_TYPE_TEST
genuine_
Obs text_char date_char num_char num
1 This is obviously text 02OCT2008 42 42
Otros consejos
Creo que necesita definir algunas opciones específicas de XML con su declaración de libname XML para exportar:
libname my_xml_out XML XMLMETA=SCHEMADATA;
Para incluir el esquema de datos. Además, es posible que desee guardar el esquema XML en un archivo separado para su posterior importación:
libname my_xml_in XML XMLSCHEMA='external-file'
después de exportar el esquema usando XMLMETA = SCHEMA
por supuesto.
Creo que esta es la documentación que necesita .
Además de ese uso liberal, se recomienda el uso de declaraciones de formato en la creación de conjuntos de datos originales.