我有一个看起来像这样的表(有更多的记录和更多的笔记):
+------+---------------+------+---------------+------+---------------+------+
|id |note_1 |len_1 |note_2 |len_2 |note_3 |len_3 |
+------+---------------+------+---------------+------+---------------+------+
|10001 |"abcde" |5 |"abc" |3 |"abcdefg" |7 |
|10002 |"defghijk" |8 |"ghuio" |5 |"yuio" |4 |
|10003 |"abc" |3 |"defg" |4 |"qw" |2 |
+------+---------------+------+---------------+------+---------------+------+
Run Code Online (Sandbox Code Playgroud)
我想在SAS data步骤中创建一个do循环,将所有音符连接起来,直到达到一定长度(在本例中,长度为10).这是为此示例创建的理想列,最大值为10:
+------+--------------+
|id |concat_notes |
+------+--------------+
|10001 |"abcdeabcab" |
|10002 |"defghijkgh" |
|10003 |"abcdefgqw" |
+------+--------------+
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试创建的代码:
data length;
set notes;
concats = "";
do i=1 to 3;
if (vvaluex(cats("len_",i)) > 10) then concat_notes= concats;
else concats = cats(concats,vvaluex(cats("note_",i)));
end;
run;
Run Code Online (Sandbox Code Playgroud)
注意:实际上,所有音符都很长,我的最大长度是32767. substrn由于空间问题,我不能将它们全部连接起来并使用前32,767.
规定的实际最大长度为32,767,这也是SAS字符变量的最大长度.因此,您可能需要对所需变量进行快速连接,如果结果超过32K字符,则会发生正常截断.
强大的代码将使用一个length语句来指定为存储结果的变量分配多少空间.
set notes;
length notes_catted $32767;
notes_catted = cats (of note_:);
Run Code Online (Sandbox Code Playgroud)
非稳健
set notes;
notes_catted = cats (of note_:); * variable will be given implicit default length $200;
Run Code Online (Sandbox Code Playgroud)
如果未指定length,则DATA Step编译器将选择创建长度为$ 200的变量.从帮助文件:
返回变量的长度
在DATA步骤中,如果CATS函数向先前未分配长度的变量返回值,则该变量的长度为200字节.另外(我的斜体),如果连接运算符(||)将值返回给先前未分配长度的变量,则给该变量一个长度,该长度是被连接的值的长度之和.