SAS XMLMap / запись XML-файла в формате - PullRequest
1 голос
/ 16 апреля 2019

Я хочу написать XML-файл, прочитав набор данных SAS и используя собственные XML-карты XMLV2 SAS с числовым форматом.

В приведенном ниже примере кода я попробовал формат "Z3" (добавьте ведущие нули к целому числу). Но другие числовые форматы, такие как «12.2» (длина 12 с двумя десятичными знаками) также не работают.

Применение формата в SAS XMLV2 XMLMaps обычно выполняется с помощью

<FORMAT>

тегов в определении COLUMN. Это отлично работает для форматов даты, но для числовых форматов это не похоже - или я что-то здесь забыл ..

/*Minimal SAS Code Example:*/

filename xmlmap temp;
filename xmlout temp;

/*Define SAS XMLV2 XMLMap:*/
data _null_;
   file xmlmap encoding='UTF-8';
   infile datalines4;
   input;
   put _infile_;
datalines4;
<?xml version="1.0" encoding="UTF-8"?>
<SXLEMAP name="TEST" version="2.1">

   <OUTPUT>
      <TABLEREF name="TEST" />
   </OUTPUT>

   <NAMESPACES count="0"/>

   <TABLE name="TEST">
      <TABLE-PATH syntax="XPath">/Root</TABLE-PATH>

      <COLUMN name="ORIGINAL">
         <PATH syntax="XPath">/Root/ORIGINAL</PATH>
         <TYPE>numeric</TYPE>
         <DATATYPE>integer</DATATYPE>
      </COLUMN>

      <COLUMN name="FORMATED">
         <PATH syntax="XPath">/Root/FORMATED</PATH>
         <TYPE>numeric</TYPE>
         <DATATYPE>integer</DATATYPE>
         <FORMAT width="3" ndec="0">Z3</FORMAT>
      </COLUMN>

   </TABLE>

</SXLEMAP>
;;;;

/*Define Input Data Set:*/
data WORK.TEST;
   infile datalines;
   input
      ORIGINAL :8.
      FORMATED :8.
      ;
   format FORMATED Z3.0;
datalines;
4 4
10 10
;
run;

/*Link XMLMap with the Input Data Set and Output XML-File*/
libname XMLTEST
   xmlv2
   xmlfileref=xmlout
   xmltype=xmlmap
   xmlmap=xmlmap
   xmlencoding='UTF-8'
   ;

/*Write Data Set to XML-File:*/
data XMLTEST.TEST;
   set WORK.TEST;
run;

/*Print XML-File to Log:*/
data _null_;
   infile xmlout;
   input;
   put _infile_;
run;

filename xmlmap clear;
filename xmlout clear;

Ожидаемый результат (XML-файл) - здесь с ведущими нулями в узле. FORMATED:

 <Root>
 <ORIGINAL>4</ORIGINAL>
 <FORMATED>004</FORMATED>
 </Root>
 <Root>
 <ORIGINAL>10</ORIGINAL>
 <FORMATED>010</FORMATED>
 </Root>

Фактический результат (XML-файл) - нет начальных нулей в узле. ФОРМАТИРОВАНО:

 <Root>
 <ORIGINAL>4</ORIGINAL>
 <FORMATED>4</FORMATED>
 </Root>
 <Root>
 <ORIGINAL>10</ORIGINAL>
 <FORMATED>10</FORMATED>
 </Root>

1 Ответ

0 голосов
/ 16 апреля 2019

Элемент SXLEMAP Column определяет, как входящий xml отображается в соответствующие атрибуты столбца набора данных SAS.

Элемент DATATYPE предписывает механизму вывести целочисленное значение в выводе xml - и это будет неформатировано. Карта информирует потребителя XML о том, как он должен обращаться со значением анализируемых данных.

Если вы перечитаете созданный вами xml

data in;
  set xmltest.test;
run;

вы увидите, что карта имеет неправильное значение элемента Z3 для формата. Значение должно быть просто Z, а модификаторы формата поступают из атрибутов <FORMAT> width и ndec.

Я не уверен, что в одном XML-файле можно предварять узлы xmldata метаданными SAS данных.

...