2016-09-12 28 views
2

でASCII文字の除去と、このコード:<a href="http://web.cs.mun.ca/~michael/c/ascii-table.html" rel="nofollow">this</a>を見るとdatasteps

data Work.SomeDataset; 
    set Work.SomeDataset; 
    SomeColumn = compress(SomeColumn, byte(34)); 
    SomeColumn = compress(SomeColumn, byte(38)); 
run; 

は右SomeColumnから文字"(バイト(34))と&(バイト(38))、これは削除することを考えに私をアム?もしそうなら、これを達成するより効率的な方法がありますか?

答えて

3

これは、すでに最適にかなり近いですが、私はお勧めしたい若干の改善のために:

data Work.SomeDataset; 
    set Work.SomeDataset; 
    SomeColumn = compress(SomeColumn,'&"'); 
run; 

これは、同じパスの両方で削除され、削除されている文字、それが明確になります。

1

はい、これらのアスキー文字は削除されます。 1つのCOMPRESS呼び出しでこれを連結することができます。もちろん、'&"'を関数に渡すことはできますが、そうしない理由があると思います。

また、このプロセスによって作成される余分なスペースが問題である場合は、COMPBLを使用してこのスペースを削除することもできます。

data Work.want; 
    set Work.have; 
    someColumn = compress(someColumn,byte(34)||byte(38)); 
    put SomeColumn=; 
run; 

また... UPDATE(SQL)を使用するか、またはデータセットを書き換え避けるために(データステップ)修正することができる

proc sql; 
    update have 
    set someColumn = compress(someColumn,byte(34)||byte(38)); 
quit; 

おそらく、より効率的で、おそらくありません。 WHEREステートメントを使用して更新を必要としないケースを除外できない場合は、最終的にはおそらく変わりませんが、もし可能であれば(例えばこれを持つことはまれである場合)より効率的かもしれません。

編集: 修正はそれが答えではないように見えます。 1行7列のクイックテストでは、MODIFYはリアルタイムで厳密に遅く、CPU時間がはるかに長くなります。

SQL UPDATEも非常に遅いので、ごくまれな更新シナリオがある場合を除いて、どちらも使用しません。

1

文字を1回の呼び出しで入力できます。

data have; 
format a $12.; 
a = "A" || byte(34) || "B"; 
output; 
a = "A" || byte(34) || "B" || byte(36) || "C"; 
output; 
run; 

data want; 
set have; 
b = compress(a,byte(34)||byte(36)); 
run; 
関連する問題

 関連する問題