【问题标题】:SAS proc stream : weird linebreaksSAS proc 流:奇怪的换行符
【发布时间】:2017-10-27 14:00:39
【问题描述】:

服务器:Unix,客户端:IE Edge 我的部分代码:

%let P_debug_log = %str(<INPUT TYPE='hidden' NAME='_DEBUG' VALUE='LOG'>);
proc stream outfile=_webout quoting=both resetdelim='_do' ASIS;
BEGIN
  %if "&_whattodo" ne "print" %then %do;
    <script language='JavaScript' type='text/javascript'>                                       
        function subForm(f,v) {
            if (v !== '') {
              $('#'+ f).append('<INPUT TYPE="hidden" NAME="'+ v +'" VALUE="1">');
            }
            $('#'+f).submit();       
          } 
      $(document).ready(function() {                                                            
        $('#footButtons').append($('.footButton'));   /* move all elements with class=footButton to pageFooter */
        $('#footMessage').append($('.footMsg'));   
        $('form.log').append("&P_debug_log.");
      });                                                                               
    </script>
  %end;
;;;;

输出: 问题是,生成的流输出在“某处”有换行符,但不是在预期的地方(使用选项 ASIS,它应该像我的代码一样格式化)。 这会导致不可预测的 JavaScript 错误,例如当换行符在 JavaScript 字符串中时。 似乎有一个隐含的 LRECL 1024。如果按预期设置换行符,那就没问题了。 有什么提示吗?

这是最初格式化的输出(页面源):

     <script language='JavaScript' type='text/javascript'>                  function subForm(f,v) {         if (v !== '') {           $('#'+ f).append('<INPUT TYPE="hidden" NAME="'+ v +'" VALUE="1">');         }          $('#'+f).submit();             }
        $(document).ready(function() {                        $('#footButtons').append($('.footButton'));            $('#footMessage').append($('.footMsg'));            $('form.log').append("
<INPUT TYPE=
'hidden
' NAME=
'_DEBUG
' VALUE=
'LOG
'
>");       });                         </script>

【问题讨论】:

  • 看起来像 ASIS/PRESCOL 选项中的错误。你可能想用 SAS 来提高它。

标签: stream sas proc


【解决方案1】:

不确定我是否有答案,但看起来宏引用是导致 PROC STREAM 将宏变量分成多行的原因。 所以如果我运行这个简化的例子:

%let P_debug_log = %str(<INPUT TYPE='hidden' NAME='_DEBUG' VALUE='LOG'>);
filename tst temp;
proc stream outfile=tst quoting=both resetdelim='_do' ASIS;
BEGIN
$('form.log').append("&P_debug_log.");
;;;;

然后它会生成这个文件:

$('form.log').append("
<INPUT TYPE='hidden
' NAME='_DEBUG
' VALUE='LOG
'>");

如果您从宏变量的值周围删除%STR(),则它只会在完整的宏变量引用前后插入换行符,而不是在宏变量中的引号周围。

$('form.log').append("
<INPUT TYPE='hidden' NAME='_DEBUG' VALUE='LOG'>
");

如果您删除 quoting=both 选项,则换行符将在引号之外,无论您是否使用宏引用。

$('form.log').append(
"<INPUT TYPE='hidden' NAME='_DEBUG' VALUE='LOG'>"
);

【讨论】:

    【解决方案2】:

    首先,谢谢大家的回答。 罗伯特彭里奇是对的。 解决方案: 如果您使用 PROC STREAM 并希望包含静态代码(如我的情况:Javascript),则使用 &STREAMDELIM READFILE 而不是 %include。 原因:如果包含的代码中有(有效!)inline cmets“//”(注释直到下一个换行符,),会导致不可预知的结果...... 多谢, 数据库

    【讨论】:

      【解决方案3】:

      只需删除您已添加到proc streamASIS 选项。

      我不确定这是否是一个未记录的功能,但它没有出现在文档中,所以我假设是这样。

      http://documentation.sas.com/?docsetId=proc&docsetVersion=9.4&docsetTarget=n12zrkr08eiacmn17lcv4fmt79tb.htm&locale=en

      一旦你删除奇怪的换行符就会消失。

      四处搜索,似乎 ASIS 选项与尝试保持列对齐有关。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多