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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top