Установка типа данных при чтении XML-данных в SAS
Вопрос
Мне нужно контролировать тип данных при чтении XML-данных в SAS.Данные XML записываются и доступны с использованием механизма XML libname в SAS.
Кажется, SAS угадывает тип данных на основе содержимого столбца:Если я напишу «20081002» в своих XML-данных в символьном столбце, они будут прочитаны обратно как числовая переменная.
Пример:
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 это характер.Остальные три теперь числовые.
Как я могу контролировать тип данных при чтении данных XML в SAS?
Решение
Взгляните на SAS XML Mapper.Он позволяет создавать карту для чтения (и записи в версии 9.2) XML-файлов и указания атрибутов столбцов.
Если это ваш XML-файл:
Это, очевидно, текст 20081002 42 42 Вы можете создать такую карту:<!-- ############################################################ -->
<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 $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
Другие советы
Я думаю, вам нужно определить некоторые конкретные параметры XML с помощью вашего XML-оператора libname для экспорта:
libname my_xml_out XML XMLMETA=SCHEMADATA;
Включить схему данных.Кроме того, вы можете сохранить схему XML в отдельный файл для последующего импорта:
libname my_xml_in XML XMLSCHEMA='external-file'
после того, как вы экспортировали схему с помощью XMLMETA=SCHEMA
конечно.Я думаю это документация, которая вам нужна.
Помимо этого, рекомендуется свободно использовать операторы формата при создании исходного набора данных.