在SAS中读取XML数据时设置数据类型
时间:2020-03-06 15:01:16 来源:igfitidea点击:
在SAS中读取XML数据时,我需要控制数据类型。使用SAS中的XML libname引擎写入和访问XML数据。
SAS似乎是根据列的内容来猜测数据类型的:如果我在字符列的XML数据中写入" 20081002",它将作为数字变量读回。
一个例子:
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;
XML数据中只有最后一列被定义为数值数据类型,但是当我将其复制到WORK库中时,只有text_char列是字符。现在,其他3个数字。
在SAS中读取XML数据时如何控制数据类型?
解决方案
我认为我们需要定义一些特定于xml的选项,然后使用libname XML语句进行导出:
libname my_xml_out XML XMLMETA=SCHEMADATA;
包括数据模式。另外,我们可能希望将XML模式保存到单独的文件中,以便以后导入:
libname my_xml_in XML XMLSCHEMA='external-file'
当然,使用XMLMETA = SCHEMA导出架构后。
我认为这是我们需要的文档。
除了建议在原始数据集创建上自由使用格式语句外,还建议使用。
看一下SAS XML Mapper。
它允许我们创建一个映射来读取(并在9.2中写入)XML文件并指定列属性。
如果这是XML文件:
这显然是文本20081002 42 42我们可以创建一个MAP,如下所示:
<!-- ############################################################ --> <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>
然后读取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;
结果:
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 . . text_char 2 date_char Num 8 DATE9. ND8601DA8. date_char 3 num_char Char 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