我在SAS中调用cURL来执行POST请求。我的代码运行正常,但是当我提交更大的请求时,post输出(json文件)会被截断。 json文件的最大大小为1098304,即使我在cURL中设置了--max-filesize选项,在SAS中设置了lrecl等于10000000.我在Windows 7上运行SAS 9.3。注意我需要能够下载更大的json文件,所以简单地限制输出的大小不是一个选项。有没有人遇到这个问题?如果是这样,你是如何处理的?
Update1:现在使用x命令而不是filename管道语句运行curl。整个文件被转储到cmd窗口中。我希望输出存储在文本文件中。我尝试在cURL命令的开头和结尾使用-o C:\ json.txt和-O C:\ json.txt,但它不起作用。文件被转储到cmd窗口。有谁知道我做错了什么?也许我可以使用另一个cURL命令?
Update2:在花了一些时间试验代码之后,我发现了" POST" cURL命令中的文本是不必要的。我删除它,一切都很完美。 cURL将整个输出直接转储到文本文件中,然后我可以用proc groovy解析json。成功了!
非常感谢Joe,Robert和user667489提供了有用的建议和分析。
最终代码:
x "curl -d @C:\Users\Bill\Desktop\curl.txt -H ""Authorization: OAuth oauth_consumer_key=""""&oauth_consumer_key"""",oauth_token=""""&oauth_token"""",oauth_signature_method=""""&oauth_signature_method."""",
oauth_signature=""""&oauth_signature."""",oauth_timestamp=""""&oauth_timestamp."""",oauth_nonce=""""&oauth_nonce."""",oauth_version=""""&oauth_version.""""""
-k &url. -o C:\json.txt";
答案 0 :(得分:2)
根据Infile Statement for Microsoft Windows,LRECL的限制应为1GB(远远超过你所拥有的)。但是,我过去曾遇到过1MB(1024 ^ 3)似乎是极限的问题。另一方面,这比你看到的要小。因此,我不确定我是否可以直接说出我的问题。
一种可能性是您正在读取UTF8字符(或其他一些unicode变体)。在这种情况下,LRECL限制可能是 bytes ,而不是字符。所以我可以从最大值看到减少 - 取决于unicode变体,最多4倍左右。您可以在lrecl =字段中尝试MAX
,看看它做了什么;希望不是32767(正如LRECL系统选项仍然声称的那样)。仍然没有解释差异,但有可能考虑。如果从10MB增加到MAX
或30MB或100MB或更高的数字会增加总长度,那么这可以解释它。我还会将卷曲最大文件大小提高到相同的数量(或者至少尝试将其提升到更大的值),以查看SAS如何处理管道存在一些问题。
尝试的一件事可能是使用RECFM=F
阅读。我想,当你从文件名中读取时,这将在infile
语句中;你可以用1MB(或更小)的串来解析它并以这种方式处理它。如果你的数据具有这样的能力,你也可以使用termstr
或其他方式用分隔符解析它(常见的是使用termstr='>'
来表示html,对于json,我认为{{ 1}}很常见)。你没有发布你的json解析正在做什么,所以我不能发表评论,但我会说从我的html解析经验(以及一些json),当它一开始不是巨大的线时更容易解析它。
答案 1 :(得分:0)
Per Joe的建议我使用x命令运行cURL,然后将输出直接保存到文本文件中。这避免了SAS中的任何限制。然后我可以使用proc groovy解析json数据。最终的cURL代码在线程的第一篇文章中。
答案 2 :(得分:-1)
您知道,SAS的最大行数为32767,因此除非响应包含多行,否则无论如何都需要找到解决方法。检查截断值的长度。应该告诉你这是不是问题。
编辑:仅适用于SAS 9.2及之前版本。感谢Joe的澄清。