我们的数据库早于我们的数据库软件,具有良好的unicode支持,并且在其位置有一个psuedo-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
答案 0 :(得分:2)
相同的代码在SAS 9.4 TS1M3的功能中有效;它可能不在早期版本中(对9.4中的FCMP和维护版本TS1M2和3中的数组处理方式进行了重大更改。)
然而,这并没有真正解决你的任意长度问题;当我用
运行你的功能时 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不允许有一种方法来获得一个未定义长度的字符串;您需要为要返回的字符串定义默认(和最大)长度。欢迎用户定义较短的长度,并在适当的时候使用。