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?

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top