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 stream
的 ASIS
选项。
我不确定这是否是一个未记录的功能,但它没有出现在文档中,所以我假设是这样。
一旦你删除奇怪的换行符就消失了。
四处搜索,似乎 ASIS 选项与尝试保持列对齐有关。
首先感谢大家的回答。
罗伯特彭里奇是对的。
解决方案:
如果您使用 PROC STREAM 并希望包含静态代码(如我的情况:Javascript),则使用 &STREAMDELIM READFILE 而不是 %include。
原因:如果包含的代码中有(有效!)内联注释“//”(注释直到下一个换行符,),将导致不可预知的结果....
多谢,
dbdb
服务器: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 stream
的 ASIS
选项。
我不确定这是否是一个未记录的功能,但它没有出现在文档中,所以我假设是这样。
一旦你删除奇怪的换行符就消失了。
四处搜索,似乎 ASIS 选项与尝试保持列对齐有关。
首先感谢大家的回答。 罗伯特彭里奇是对的。 解决方案: 如果您使用 PROC STREAM 并希望包含静态代码(如我的情况:Javascript),则使用 &STREAMDELIM READFILE 而不是 %include。 原因:如果包含的代码中有(有效!)内联注释“//”(注释直到下一个换行符,),将导致不可预知的结果.... 多谢, dbdb