我正在尝试使用CURL和SAS 9.3下载XML数据。我的代码正确地指定了CURL的URL (再次感谢RP)并返回一个XML文件。不幸的是,有一堆垃圾字符出现在XML数据之前,并导致错误。通常,我会创建一个字符串来解析垃圾,但是如果我增加音量,SAS中的~32K长度限制将成为一个问题。有人知道如何在不使用字符串变量的情况下从婴儿中删除垃圾数据吗?或者用一个字符串变量来做,但绕过~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;档案:
% 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 -->发布于 2014-07-22 17:33:06
根据Joe的建议,这是一个卷发问题,我做了一些快速研究,并在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;https://stackoverflow.com/questions/24874016
复制相似问题