在 SAS 函数中是否有等效的 "of some_array{*}" 形式

Is there an equivalent of the "of some_array{*}" form for use in SAS functions

我们的数据库早于具有良好 unicode 支持的数据库软件,取而代之的是伪 base64 编码,用于在 ascii 字段中存储 UTF16 字符。我正在编写一个函数,将这种类型的字段转换为 SAS 中的纯 UTF8。

该函数遍历字符串,将每组三个 ascii 字符转换为 unicode 字符并将其放入数组中。在数据步骤中试验代码时,我曾使用 cat(of final{*}) 将数组转换为字符串,但相同的代码在函数中似乎无效。

我目前正在使用 collate = trim(collate)!!trim(final{i}) 和任意长度的整理字符串整理循环中的字符串,但我想直接从数组中生成它或至少设置整理字符串的大小基于输入字符串的长度。

I've included a pastebin of the data and function here.

编辑:我使用的 SAS 版本是 9.3

同样的代码在SAS 9.4 TS1M3的一个函数中有效;它可能不在早期版本中(在 9.4 和维护版本 TS1M2 和 3 中对数组在 FCMP 中的处理方式进行了重大更改)。

但是,这并不能真正解决您的任意长度问题;当我 运行 你的功能

        outtext = cat(of final{*});
        return (outtext);

我得到... 1 个字符!当我 运行

        return(cats(of final{*}));

输出:

Obs text_enc finaltext 
1 ABCABlABjABhAB1ABzABlAAgABVABUABGAA4AAgABpABzAAgABoABhAByABk BecauseU 
2 ABTABpABtABwABsABlAByAAgABsABpABrABlAAgAB0ABoABpABz          Simplerl 
3 ABJABvAAgABJABvAAgABCAByABvABtABpABvABz                      IoIoBrom 

哪个好一点(猫给你修剪),我还是只有8个字符。这是因为 8 个字符是 SAS 中未声明字符变量的默认长度。扩展长度(对 outtext 使用 length 语句),您将得到:

Obs text_enc finaltext 
1 ABCABlABjABhAB1ABzABlAAgABVABUABGAA4AAgABpABzAAgABoABhAByABk  BecauseUTF8ishard 
2 ABTABpABtABwABsABlAByAAgABsABpABrABlAAgAB0ABoABpABz           Simplerlikethis 
3 ABJABvAAgABJABvAAgABCAByABvABtABpABvABz                       IoIoBromios 

那么您仍然需要定义您需要的任何长度。据我所知,FCMP 不允许使用未定义长度的字符串;您需要为要使用的字符串定义默认(和最大)长度 return。欢迎用户在适当的时候定义更短的长度。