Definição do tipo de dados ao ler dados XML no SAS
Pergunta
Eu preciso para controlar o tipo de dados ao ler dados XML em SAS. Os dados XML são escritos e acessado usando o motor libname XML no SAS.
SAS parece adivinhar o tipo de dados com base no conteúdo de uma coluna:. Se eu escrever "20081002" para os meus dados XML em uma coluna de caracteres, ele será lido novamente como uma variável numérica
Um exemplo:
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;
Apenas a última coluna é definida como o tipo de dados numéricos nos dados XML, mas quando eu copiá-lo para o meu trabalho da biblioteca, somente a coluna text_char é o caráter. Os outros 3 estão agora numérico.
Como posso controlar o tipo de dados ao ler dados XML no SAS?
Solução
Dê uma olhada no SAS XML Mapper. Ele permite que você crie um mapa para ler (e wrte em 9.2) arquivos XML e especificando atributos de coluna.
Se este é o seu arquivo XML:
Esta é, obviamente, texto 20081002 42 42 Você poderia criar um mapa 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>
E, em seguida, ler o arquivo 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
Outras dicas
Eu acho que você precisa definir algumas opções específicas xml whith sua declaração XML libname para ir de exportação:
libname my_xml_out XML XMLMETA=SCHEMADATA;
Para incluir o esquema de dados. Além disso, você pode querer salvar o esquema XML para um arquivo separado para posterior importação:
libname my_xml_in XML XMLSCHEMA='external-file'
Depois de exportou o esquema usando XMLMETA=SCHEMA
claro.
Acho esta é a documentação que você precisa .
Além de que o uso liberal de declarações de formato sobre a criação de base de dados original é recomendado.