문제

SAS에서 XML 데이터를 읽을 때 데이터 유형을 제어해야합니다. XML 데이터는 SAS의 XML LibName 엔진을 사용하여 작성 및 액세스합니다.

SAS는 열의 내용을 기반으로 데이터 유형을 추측하는 것 같습니다. 문자 열의 XML 데이터에 "20081002"를 작성하면 숫자 변수로 다시 읽습니다.

An example:

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 데이터에서 숫자 데이터 유형으로 정의되지만 작업 라이브러리에 복사하면 열만 가능합니다. Text_char 캐릭터입니다. 다른 3 개는 이제 숫자입니다.

SAS에서 XML 데이터를 읽을 때 데이터 유형을 어떻게 제어 할 수 있습니까?

도움이 되었습니까?

해결책

SAS XML 맵퍼를 살펴보십시오. 읽기 (및 9.2) XML 파일의 wrte를 만들고 열 속성을 지정할 맵을 만들 수 있습니다.

이것이 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

다른 팁

내보내기에 대한 LibName XML 문을 사용하는 XML 특정 옵션을 정의해야한다고 생각합니다.

libname my_xml_out XML XMLMETA=SCHEMADATA;

데이터 스키마를 포함합니다. 또한 XML 스키마를 나중에 가져 오기 위해 별도의 파일에 저장할 수도 있습니다.

libname my_xml_in XML XMLSCHEMA='external-file'

사용을 사용하여 스키마를 내보낸 후 XMLMETA=SCHEMA 물론. 제 생각에는 이것은 필요한 문서입니다.

원래 데이터 세트 생성에서 형식 문을 자유롭게 사용하는 것 외에도 권장됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top