Festlegen Datentyp, wenn XML-Daten in SAS Lesen
Frage
Ich brauche den Datentyp zu steuern, wenn XML-Daten in SAS zu lesen. Die XML-Daten werden geschrieben und zugegriffen, um den XML-libname Motor in SAS mit.
SAS scheint den Datentyp zu erraten, basierend auf dem Inhalt einer Spalte. Wenn ich „20081002“ zu meinen XML-Daten in einer Zeichenspalte zu schreiben, wird es zurück in einer numerischen Variable gelesen wird
Ein Beispiel:
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;
Nur die letzte Spalte wird als numerischer Datentyp in den XML-Daten definiert, aber wenn ich es in meine Arbeit Bibliothek zu kopieren, nur die Spalte text_char ist Charakter. Die anderen 3 sind nun numerisch.
Wie kann ich den Datentyp steuern, wenn XML-Daten in SAS zu lesen?
Lösung
Werfen Sie einen Blick auf die SAS XML-Mapper. Es ermöglicht Ihnen, eine Karte zu erstellen zu lesen (und wrte in 9.2) XML-Dateien und die Angabe Spaltenattribute.
Wenn Sie zur XML-Datei:
Dies ist offensichtlich Text 20081002 42 42 Sie könnten einen MAP wie folgt erstellen:
<!-- ############################################################ -->
<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>
Und dann lesen Sie die XML-Datei:
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;
Ergebnis:
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
Andere Tipps
Ich glaube, Sie brauchen einige xml spezifische Optionen whith Ihre libname XML-Anweisung für den Export gehen zu definieren:
libname my_xml_out XML XMLMETA=SCHEMADATA;
Um das Datenschema enthält. Außerdem sollten Sie das XML-Schema in eine separate Datei für den späteren Import speichern:
libname my_xml_in XML XMLSCHEMA='external-file'
, nachdem Sie das Schema mit XMLMETA=SCHEMA
natürlich exportiert.
Ich denke, dies ist die Dokumentation, die Sie brauchen .
Neben diesem großzügigen Einsatz von Formatanweisungen auf Originaldaten Erstellung empfohlen.