Sum Char Columns直到Count Reached

tub*_*guy 1 sas

我有一个看起来像这样的表(有更多的记录和更多的笔记):

+------+---------------+------+---------------+------+---------------+------+
|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.

Ric*_*ard 6

规定的实际最大长度为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字节.另外(我的斜体),如果连接运算符(||)将值返回给先前未分配长度的变量,则给该变量一个长度,该长度是被连接的值的长度之和.