2008-10-02 7 views
2

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 accédées en utilisant le moteur XML libname dans SAS.Définition du type de données lors de la lecture de données XML dans SAS

SAS semble deviner le type de données basé sur le contenu d'une colonne: Si j'écris "20081002" dans mes données XML dans une colonne de caractères, il sera relu en tant que 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 quand je le copier dans ma bibliothèque TRAVAIL, seule la colonne text_char est le 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?

Répondre

6

Jetez un coup d'œil au SAS XML Mapper. Il vous permet de créer une carte pour lire (et écrire dans 9.2) des fichiers XML et spécifier des attributs de colonne.

Si ceci est votre fichier XML:

Ceci est évidemment texte Vous pouvez créer une carte comme celle-ci:

<!-- ############################################################ --> 
<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 puis lisez 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 
1

Je pense que vous devez définir certaines options spécifiques xml cinque votre déclaration XML libname pour l'exportation go:

libname my_xml_out XML XMLMETA=SCHEMADATA; 

Pour inclure le schéma de données. En outre, vous pouvez enregistrer le schéma XML dans un fichier séparé pour l'importation plus tard:

libname my_xml_in XML XMLSCHEMA='external-file' 

après avoir exporté le schéma à l'aide XMLMETA=SCHEMA bien sûr. Je pense que this is the documentation you need. En outre, il est recommandé d'utiliser généreusement les instructions de formatage sur la création de jeu de données d'origine.

+0

Merci pour l'entrée. Malheureusement, je ne peux pas le faire fonctionner - SAS prétend toujours que mes données de caractère qui ressemblent à des nombres, sont du type de données NUM, quand elles sont lues à partir de XML en utilisant XMLSCHEMA. –

Questions connexes