Impostazione del tipo di dati durante la lettura di dati XML in SAS
Domanda
Devo controllare il tipo di dati durante la lettura di dati XML in SAS. I dati XML vengono scritti e accessibili tramite il motore XML libname in SAS.
SAS sembra indovinare il tipo di dati in base al contenuto di una colonna: se scrivo "20081002" ai miei dati XML in una colonna di caratteri, verranno riletti come variabili numeriche.
Un esempio:
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 l'ultima colonna è definita come tipo di dati numerici nei dati XML, ma quando lo copio nella mia libreria WORK, solo la colonna text_char è carattere. Gli altri 3 sono ora numerici.
Come posso controllare il tipo di dati durante la lettura di dati XML in SAS?
Soluzione
Dai un'occhiata al SAS XML Mapper. Ti consente di creare una mappa per leggere (e scrivere in 9.2) file XML e specificare gli attributi di colonna.
Se questo è il tuo file XML:
Questo è ovviamente un testo 20081002 42 42 È possibile creare una MAPPA come questa:
<!-- ############################################################ -->
<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 quindi leggi il file 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;
Risultato:
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
Altri suggerimenti
Penso che tu debba definire alcune opzioni specifiche xml con la tua dichiarazione XML libname per l'esportazione:
libname my_xml_out XML XMLMETA=SCHEMADATA;
Per includere lo schema dei dati. Inoltre, potresti voler salvare lo schema XML in un file separato per l'importazione successiva:
libname my_xml_in XML XMLSCHEMA='external-file'
dopo aver esportato lo schema usando XMLMETA = SCHEMA
ovviamente.
Penso che questa è la documentazione che ti serve .
A parte quell'uso liberale di istruzioni di formato sulla creazione di set di dati originali, si raccomanda