无法使用proc IMPORT导入SAS中的.txt文件

时间:2018-02-01 22:59:54

标签: sas

我的程序进行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),并将其存储在数据集中(然后通过循环一遍又一遍地执行此操作)颠覆相同的数据集)。如果您可以帮助导入整个文件或直接导入我需要的信息,那么这将有所帮助。

2 个答案:

答案 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;