SAS 过程流:奇怪的换行符

SAS proc stream : weird linebreaks

服务器: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;
;;;;

输出: 问题是,生成的流输出有换行符 "somewhere" 但不是预期的地方(使用 Option 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>

不确定我是否有答案,但看起来宏引用是导致 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'>"
);

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

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

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

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

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

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