1

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

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

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

我在这里包含了数据和功能的粘贴箱。

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

4

1 回答 1

2

相同的代码在 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 中未声明字符变量的默认长度。扩展长度(使用lengthouttext 的语句),你会得到:

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

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

于 2016-07-26T17:20:40.690 回答