2017-05-05 5 views
0

文字をアルファベット順に並べ替えることをお勧めします。文字をアルファベット順に並べ替える - SAS

など。

'apple' = 'aelpp' 

私は多少類似している見ている唯一の機能は、SORTCあるが、私は可能であれば、文字の配列に各単語を分割を回避したいと思います。

+0

あなたが求めているのは、これだけの機能はありません。あなたはまだこれを試してみましたか? – Joe

答えて

2

ジョーの権利 - これを行う組み込み関数はありません。ここには2つのオプションがあります:

  1. 文字列を配列に分割し、call sortcを使用して配列をソートします。あなたは最初に十分な長さの配列を定義していれば、call pokelongを使ってかなり簡単にこれを行うことができます。
  2. sorting algorithmを実装してください。このルートを降りる場合は、=記号の左側にあるsubstrを使用して、文字列全体を書き換えずに個々の文字を変更することをお勧めします。

ここでは、#1の操作方法の例を示します。 #2ははるかに多くの作業になります。

data _null_; 
    myword = 'apple'; 
    array letters[5] $1; 
    call pokelong(myword,addrlong(letters1),5); /*Limit # of chars to copy to the length of array*/ 
    call sortc(of letters[*]); 
    myword = cat(of letters[*]); 
    putlog _all_; 
run; 

N.B.ここで使用されている長さ5の配列の場合、配列の末尾を超えてオーバーフローすることを避けるために、call pokelongを使用する場合は、配列の先頭にある文字列の最初の5文字だけをメモリに書き込んでください。 mywordのより長い値を処理するときにメモリの他の任意のセクション。これは望ましくない副作用を引き起こす可能性があります。アプリケーション/システムがクラッシュするまた、SAS University Editionでは配列を取り込むためのこのテクニックは機能しません。使用している場合は、代わりにdo-loopを使用する必要があります。

私はこれを少しテストしました - 長さ100の長さ100の2mのランダムな単語をソートするには、ASCII印刷可能な範囲全体から選択した文字で構成し、数年前のPCの単一CPUを使用して約15秒かかりましたテストデータセットの作成に時間がかかりました。

data have; 
    length myword $100; 
    do i = 1 to 2000000; 
    do j = 1 to 100; 
     substr(myword,j,1) = byte(32 + int(ranuni(1) * (126 - 32))); 
    end; 
    output; 
    end; 
    drop i j; 
run; 

data want; 
    set have; 
    array letters[100] $1; 
    call pokelong(myword,addrlong(letters1),100); /*Limit # of chars to copy to the length of array*/ 
    call sortc(of letters[*]); 
    myword = cat(of letters[*]); 
    drop letters:; 
run; 
+0

高価な#1はどれくらいのことがありますか?私は約200万レコードあります。最終的には、2番目のリストと[SPEDIS](http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000245949.htm)を使用して、一致。私はこれがファジーマッチングを行うための奇妙な方法かも知れないが、これが最良のアプローチだと私に信じさせる顕著な状況がある。 –

+0

@JamesSteeleテストを追加しました - (SASの通常のような)制限要因はディスクI/Oのようです。 – user667489

+0

これは、空白の文字列の空白を除いて、良い解決策です。私は2つの変更を行います:1つは生成ルーチンに、もう1つはWANTデータに変更します。 – Joe

関連する問題