我想从变量中删除非ASCII字符.我没有用更优雅的方法取得成功,所以我使用压缩和提名我想保留的角色(因为我不知道我想删除的那些).它工作,但我想保留两个字符",'但我不能正确地将这两个字符传递到压缩功能.
data _null_;
_text='#AB'!!byte(13)!!'C"D';
_text_select=compress(_text,"ABCDEFGHIJKLMNOPQRSTUVWXYZ /-1234567890(),.'&?;=%:+><`[]*#","k");
put _text;
put _text_select;
run;
Run Code Online (Sandbox Code Playgroud)
首先,如果您关注的是"控制"字符,则"c"选项是一个好选项.
compress(textstr,,'c');
Run Code Online (Sandbox Code Playgroud)
这会删除ASCII早期的内容,例如换行符,制表符等.(可能是前40个字符从'00'x到'0F'x,可能'07'x,尽管我从未见过精确定义.)
如果你想保持基本上'可打印的字符','w'选项是有帮助的.
compress(textstr,,'kw');
Run Code Online (Sandbox Code Playgroud)
如果只是通过另一个引用转义报价,那么你的方法可以成为你想要的唯一方法.
compress(_text,"ABCDEFGHIJKLMNOPQRSTUVWXYZ /-1234567890(),.'&?;=%:+><`[]*#""","k");
Run Code Online (Sandbox Code Playgroud)
您还可以使用"p"来保留所有标点符号.事实上,你至少可以简化这一点.
data _null_;
_text='#AB'!!byte(13)!!'C"D';
_text_select=compress(_text," /-()&=%+><` []*#","knp");
put _text;
put _text_select;
run;
Run Code Online (Sandbox Code Playgroud)
我不完全确定什么是正式的'标点符号',可能是 - 也是一个,可能是().
编辑:这是测试保留内容的好方法(在官方ASCII集中,即高达'7F'x):
data test;
length _text $255;
do _t = 1 to 255;
_text =byte(_t)||_text;
end;
_text_select=compress(_text," /-(),.'&""?;=%:+><`[]*#","kn");
put _text=;
put _text_select=;
run;
Run Code Online (Sandbox Code Playgroud)
P似乎保留了许多有点怪异的东西,其中一些显然不是标点符号,所以很明显SAS在那里做错了.老实说,我很想写一张故障单,因为它肯定没有做到它应该做的事情.