SAS:从XML中删除垃圾数据

时间:2014-07-21 20:22:58

标签: xml curl sas

我正在尝试使用CURL和SAS 9.3来下载XML数据。我有正确指定CURL的URL的代码(再次感谢RP)并返回一个XML文件。不幸的是,在XML数据之前有一堆垃圾字符并导致错误。通常情况下,我会创建一个字符串来解析垃圾,但如果增加音量,SAS中的~32K长度限制将成为一个问题。有没有人知道如何在不使用字符串变量的情况下从infile中删除垃圾数据?或者也许用字符串变量来做但却绕过~32K限制?最终,我想使用XML映射来解析数据,以便以SAS文件格式获取数据。非常感谢。

代码:

%let query= %sysfunc(urlencode(SELECT * FROM yahoo.finance.option_contract WHERE symbol='YHOO'));
%let env  = %sysfunc(urlencode(store://datatables.org/alltableswithkeys));
%let url  = https://query.yahooapis.com/v1/public/yql?q=&query^%nrstr(&)diagnostics=true^%nrstr(&)env=&env;

filename curl pipe "d:\sasdev\common\bin\curl\curl.exe -k &url 2>&1";

data _null_;
  infile curl lrecl=32767;
  input;
  put _infile_;
run;

INFILE:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  1092    0
1092    0     0   1591      0 --:--:-- --:--:-- --:--:--  1591<?xml version="1.0" encoding="UTF-
8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="1" yahoo:created="2014-07
-21T10:13:07Z" yahoo:lang="en-US"><diagnostics><url execution-start-time="0" execution-stop-time
="1" execution-time="1"><![CDATA[http://www.datatables.org/yahoo/finance/option_contract/yahoo.f
inance.option_contract.xml]]></url><publiclyCallable>true</publiclyCallable><url execution-start
-time="4" execution-stop-time="275" execution-time="271"><![CDATA[http://finance.yahoo.com/q/op?
s=YHOO]]></url><javascript execution-start-time="3" execution-stop-time="285" execution-time="28
1" instructions-used="12243" table-name="yahoo.finance.option_contract"></javascript><user-time>
285</user-time><service-time>247</service-time><build-version>0.2.2635</build-version></diagnost
ics><results><option symbol="YHOO"><contract>2014-07</contract><contract>2014-08</contract><cont
ract>2014-09</contract><contract>2014-10</contract><contract>2015-01</contract><contract>2016-01
</contract></option></results></query><!-- total: 285 -->
<!-- engine4.yql.gq1.yahoo.com -->

1 个答案:

答案 0 :(得分:0)

根据Joe的建议,这是一个CURL问题,我做了一些快速研究,并在CURL命令中添加了一个“s”(-ks而不是-k)删除了标题(又称垃圾数据)。

修改后的代码:

%let query= %sysfunc(urlencode(SELECT * FROM yahoo.finance.option_contract WHERE symbol='YHOO'));
    %let env  = %sysfunc(urlencode(store://datatables.org/alltableswithkeys));
    %let url  = https://query.yahooapis.com/v1/public/yql?q=&query^%nrstr(&)diagnostics=true^%nrstr(&)env=&env;

    filename curl pipe "d:\sasdev\common\bin\curl\curl.exe -ks &url 2>&1";

    data _null_;
      infile curl lrecl=32767;
      input;
      put _infile_;
    run;