Définition du type de données lors de la lecture de données XML dans SAS
Question
Je dois contrôler le type de données lors de la lecture de données XML dans SAS. Les données XML sont écrites et accessibles à l’aide du moteur XML libname de SAS.
SAS semble deviner le type de données en fonction du contenu d’une colonne: Si j’écris " 20081002 " mes données XML dans une colonne de caractères, elles seront lues comme une variable numérique.
Un exemple:
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;
Seule la dernière colonne est définie comme type de données numériques dans les données XML, mais lorsque je la copie dans ma bibliothèque WORK, seule la colonne text_char est un caractère. Les 3 autres sont maintenant numériques.
Comment puis-je contrôler le type de données lors de la lecture de données XML dans SAS?
La solution
Jetez un coup d’œil au SAS XML Mapper. Il vous permet de créer une carte pour lire (et écrire en 9.2) les fichiers XML et spécifier les attributs de colonne.
S'il s'agit de votre fichier XML:
C'est évidemment du texte 20081002 42 42 Vous pouvez créer une MAP comme ceci:
<!-- ############################################################ -->
<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>
Et lisez ensuite le fichier 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;
Résultat:
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
Autres conseils
Je pense que vous devez définir des options spécifiques à xml avec votre instruction XML libname pour l'exportation, allez:
libname my_xml_out XML XMLMETA=SCHEMADATA;
Pour inclure le schéma de données. Vous pouvez également vouloir enregistrer le schéma XML dans un fichier séparé pour une importation ultérieure:
libname my_xml_in XML XMLSCHEMA='external-file'
après avoir exporté le schéma en utilisant XMLMETA = SCHEMA
bien sûr.
Je pense que c'est la documentation dont vous avez besoin .
Hormis l’utilisation généralisée des instructions de format lors de la création du jeu de données original, il est recommandé.