我需要将数据从 SAS 数据库导出到 XML 文件。 XML结构是第三方定义的,所以必须遵循。
我创建了一个定义 XML 的映射文件,但我不知道如何合并数据以使某些值不重复。基本上如何在表中创建一个表。 (我无法复制所需的结构。)
对于一家公司,我需要输入地址和所有交易的列表。但现在我在 XML 中为表中的每一行获取 1 条记录。
我需要如下输出
<CESOP>
<PaymentDataBody>
<ReportedPayee>
<Name>COMPANY1</Name>
<Address>
<FreeAddress>Address 1</FreeAddress>
</Address>
<ReportedTransaction>
<trns_ID>TRNS1</trns_ID>
<trns_CCY>EUR</trns_CCY>
</ReportedTransaction>
<ReportedTransaction>
<trns_ID>TRNS2</trns_ID>
<trns_CCY>USD</trns_CCY>
</ReportedTransaction>
</ReportedPayee>
<ReportedPayee>
<Name>COMPANY2</Name>
<Address>
<FreeAddress>Address 1</FreeAddress>
</Address>
<ReportedTransaction>
<trns_ID>TRNS1</trns_ID>
<trns_CCY>EUR</trns_CCY>
</ReportedTransaction>
</ReportedPayee>
</PaymentDataBody>
</CESOP>
但是我得到了这个:
<CESOP>
<PaymentDataBody>
<ReportedPayee>
<Name>COMPANY1</Name>
<Address>
<FreeAddress>Address 1</FreeAddress>
</Address>
<ReportedTransaction>
<trns_ID>TRNS1</trns_ID>
<trns_CCY>EUR</trns_CCY>
</ReportedTransaction>
</ReportedPayee>
<ReportedPayee>
<Name>COMPANY1</Name>
<Address>
<FreeAddress>Address 1</FreeAddress>
</Address>
<ReportedTransaction>
<trns_ID>TRNS2</trns_ID>
<trns_CCY>USD</trns_CCY>
</ReportedTransaction>
</ReportedPayee>
<ReportedPayee>
<Name>COMPANY2</Name>
<Address>
<FreeAddress>Address 1</FreeAddress>
</Address>
<ReportedTransaction>
<trns_ID>TRNS1</trns_ID>
<trns_CCY>EUR</trns_CCY>
</ReportedTransaction>
</ReportedPayee>
</PaymentDataBody>
</CESOP>
SAS 代码:
data COMP;
length COMPANY $200. ADDRESS $200. COUNTRY $200. TRNS_ID $200. TRNS_CCY $3;
infile datalines dlm = '|';
input COMPANY ADDRESS COUNTRY TRNS_ID TRNS_CCY;
datalines;
COMPANY1|Address 1|CZ|TRNS1|EUR
COMPANY1|Address 1|CZ|TRNS2|USD
COMPANY2|Address 1|DE|TRNS1|EUR
run;
filename out 'path\compout.xml';
libname out xmlv2 xmltype=xmlmap xmlmap='path\test.map';
data out.COMP;
set COMP;
run;
XML 文件只是一个文本文件。所以只需使用普通的 SAS 方法来写入文本文件即可。
data _null_;
file OUT ;
if _n_=1 then put '<CESOP>' / @3 '<PaymentDataBody>';
if eof then put @3 '</PaymentDataBody>' / '</CESOP>';
set comp end=eof;
by company ;
if first.company then put
@5 '<ReportedPayee>'
/ @7 '<Name>' COMPANY +(-1) '</Name>'
/ @7 '<Address>'
/ @9 '<FreeAddress>' ADDRESS +(-1) '</FreeAddress>'
/ @7 '</Address>'
;
put
@7 '<ReportedTransaction>'
/ @9 '<trns_ID>' TRNS_ID +(-1) '</trns_ID>'
/ @9 '<trns_CCY>' TRNS_CCY +(-1) '</trns_CCY>'
/ @7 '</ReportedTransaction>'
;
if last.company then put
@5 '</ReportedPayee>'
;
run;
结果
<CESOP>
<PaymentDataBody>
<ReportedPayee>
<Name>COMPANY1</Name>
<Address>
<FreeAddress>Address 1</FreeAddress>
</Address>
<ReportedTransaction>
<trns_ID>TRNS1</trns_ID>
<trns_CCY>EUR</trns_CCY>
</ReportedTransaction>
<ReportedTransaction>
<trns_ID>TRNS2</trns_ID>
<trns_CCY>USD</trns_CCY>
</ReportedTransaction>
</ReportedPayee>
<ReportedPayee>
<Name>COMPANY2</Name>
<Address>
<FreeAddress>Address 1</FreeAddress>
</Address>
<ReportedTransaction>
<trns_ID>TRNS1</trns_ID>
<trns_CCY>EUR</trns_CCY>
</ReportedTransaction>
</ReportedPayee>
</PaymentDataBody>
</CESOP>