我的程序进行Web服务调用并以XML格式接收响应,我将其存储为output.txt。在记事本中打开时,文件看起来像这样
<OwnerInquiryResponse xmlns="http://www.fedex.com/esotservice/schema"><ResponseHeader><TimeStamp time="2018-02-01T16:09:19.319Z"/></ResponseHeader><Owner><Employee firstName="Gerald" lastName="Harris" emplnbr="108181"/><SalesAttribute type="Sales"/><Territory NodeGlobalRegion="US" SegDesc="Worldwide Sales" SegNbr="1" TTY="2-2-1-2-1-1-10"/></Owner><Delegates/><AlignmentDetail><SalesAttribute type="Sales"/><Alignments/></AlignmentDetail></OwnerInquiryResponse>
我无法使用proc IMPORT将此文件读入SAS。我的SAS代码低于
proc import datafile="/mktg/prc203/abhee/output.txt" out=work.test2 dbms=dlm replace;
delimiter='<>"=';
getnames=yes;
run;
我的日志是
1 %_eg_hidenotesandsource;
5 %_eg_hidenotesandsource;
28
29 proc import datafile="/mktg/prc203/abhee/output.txt" out=work.test2 dbms=dlm replace;
30 delimiter='<>"=';
31 getnames=yes;
32 run;
NOTE: Unable to open parameter catalog: SASUSER.PARMS.PARMS.SLIST in update mode. Temporary parameter values will be saved to
WORK.PARMS.PARMS.SLIST.
Unable to sample external file, no data in first 5 records.
ERROR: Import unsuccessful. See SAS Log for details.
NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROCEDURE IMPORT used (Total process time):
real time 0.09 seconds
cpu time 0.09 seconds
33
34 %_eg_hidenotesandsource;
46
47
48 %_eg_hidenotesandsource;
51
我的最终目标是从上述文件中挖掘员工名字(Gerald),姓氏(Harris)和员工编号(108181),并将其存储在数据集中(然后通过循环一遍又一遍地执行此操作)颠覆相同的数据集)。如果您可以帮助导入整个文件或直接导入我需要的信息,那么这将有所帮助。
答案 0 :(得分:1)
如果您只需要这三个字段,那么命名输入单个输入语句是完全可行的,并且可以说优于parsing xml with regex:
data want;
infile xmlfile dsd dlm = ' /';
input @"Employee" @"firstName=" firstName :$32. @"lastName=" lastName :$32. @"emplnbr=" emplnbr :8.;
run;
这使用理查德答案中构造的输入文件。初始@Employee
是可选的,但降低了拾取任何字段的风险,这些字段的名称与作为不同顶级字段的子字段的所需字段相同。
奖励:如果您遇到类似情况,也可以使用相同的方法导入json文件。
答案 1 :(得分:0)
由于您无法使用首选的读取xml数据的方法,和您正在处理来自服务查询的单个记录结果 git'er done 方法似乎必要的。
一个没有成功的想法是使用命名输入。
input @'Employee' lastname= firstname= emplnbr=;
无法使用$QUOTE.
信息中删除引号,也不会将荣誉记录为dlm=' /'
一种可行的方法是读取单行并使用带捕获组的正则表达式解析值。 PRXPARSE
用于编译模式,PRXMATCH
用于测试匹配,PRXPOSN
用于检索捕获组。
* create a file to read from (represents the file from the service call capture);
options ls=max;
filename xmlfile "%sysfunc(pathname(WORK))\1-service-call-record.xml";
data have;
input;
file xmlfile;
put _infile_;
datalines;
<OwnerInquiryResponse xmlns="http://www.fedex.com/esotservice/schema"><ResponseHeader><TimeStamp time="2018-02-01T16:09:19.319Z"/></ResponseHeader><Owner><Employee firstName="Gerald" lastName="Harris" emplnbr="108181"/><SalesAttribute type="Sales"/><Territory NodeGlobalRegion="US" SegDesc="Worldwide Sales" SegNbr="1" TTY="2-2-1-2-1-1-10"/></Owner><Delegates/><AlignmentDetail><SalesAttribute type="Sales"/><Alignments/></AlignmentDetail></OwnerInquiryResponse>
run;
* read the entire line from the file and parse out the values using Perl regular expression;
data want;
infile xmlfile;
input;
rx_employee = prxparse('/employee\s+firstname="([^"]+)"\s+lastname="([^"]+)"\s+emplnbr="([^"]+)"/i');
if prxmatch(rx_employee,_infile_) then do;
firstname = prxposn(rx_employee, 1, _infile_);
lastname = prxposn(rx_employee, 2, _infile_);
emplnbr = prxposn(rx_employee, 3, _infile_);
end;
keep firstname last emplnbr;
run;