1

私たちのデータベースは、優れた Unicode サポートを備えたデータベース ソフトウェアよりも前のものであり、その代わりに、ASCII フィールドに UTF16 文字を格納するために使用する疑似 base64 エンコーディングがあります。SAS内でこのタイプのフィールドをストレートUTF8に変換する関数を書いています。

この関数は、3 つの 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 文字しか得られません. これは、SAS で宣言されていない文字変数のデフォルトの長さが 8 文字であるためです。(outtext のステートメントを使用して) 長さを拡張すると、次のlengthようになります。

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

必要な長さを定義する必要があります。FCMP では、私の知る限り、長さが未定義の文字列を使用する方法は許可されていません。返す文字列のデフォルト (および最大) の長さを定義する必要があります。ユーザーはより短い長さを定義することができ、適切な場合はそうすべきです。

于 2016-07-26T17:20:40.690 に答える