Настройка типа данных при чтении данных XML в SAS - PullRequest
2 голосов
/ 02 октября 2008

Мне нужно контролировать тип данных при чтении данных XML в SAS. Данные XML записываются и используются с помощью механизма имени lib XML в 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 является символьным. Остальные 3 теперь числовые.

Как я могу контролировать тип данных при чтении данных XML в SAS?

Ответы [ 2 ]

6 голосов
/ 11 февраля 2009

Посмотрите на 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    $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 голос
/ 02 октября 2008

Я думаю, что вам нужно определить некоторые специфичные для xml опции, с которыми ваш XML-оператор libname для экспорта идет:

libname my_xml_out XML XMLMETA=SCHEMADATA;

Для включения схемы данных. Кроме того, вы можете сохранить схему XML в отдельный файл для последующего импорта:

libname my_xml_in XML XMLSCHEMA='external-file'

после того, как вы экспортировали схему, используя, конечно, XMLMETA=SCHEMA. Я думаю это документация, которая вам нужна .

Кроме того, рекомендуется свободно использовать операторы формата при создании исходного набора данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...