我在SAS中创建了一个逐行读取文本文件的数据集。因此,当我在我的数据集中读取这些行时,我想要消除特殊字符,如*,%, - ,;从该特定行的开头和结尾开始。 我应该使用什么功能?字符可以按任何顺序出现,我必须用空格替换它们。 请帮忙!
答案 0 :(得分:2)
data forAditi;
infile datalines truncover;
format aLine translated parced $80.;
input @1 aLine $char80.;
**旧学校翻译功能做得很好,但也翻译中间的人物**;
translated = translate(aLine,' ','* % - ;');
**因此您可能更喜欢正则表达式**;
retain prx_nr;
if _N_ EQ 1 then prx_nr = prxparse('/[ *%-;]*(.+[^ *%-;])/') ;
match = prxmatch(prx_nr, aLine);
call prxposn(prx_nr, 1, pos, len);
substr(parced,pos) = prxposn(prx_nr, 1, aLine);
** [ *%-;]*
查找零个或多个特殊字符,.+
查找一个或多个字符,[^ *%-;]
查找任何非特殊字符。 prxmatch 将查找可能的最长匹配,因此从第一个字符开始,特殊与否,以及最后一个非特殊字符结束。但是, prxposn 会将 pos ition和 len gth设置为(...)
中包含的匹配部分,即来自第一个非特殊字符直到最后。现在使用SAS重新初始化其所有变量的事实,除非明确保留,我们只需将该部分复制到正确的位置parced
**;
datalines4;
This is text;
--That should be cleaned up,
And here- you have *% special characters in the middle.
Blanks at the start should be preserved. Right?
;;;;
run;
答案 1 :(得分:0)
请看看sas中的翻译功能。 第一个参数是你的变量,第二个参数是空白(你将拥有的术语),第三个参数是你需要用第二个参数替换的所有特殊字符的列表。
translate(变量,'','*% - ');
答案 2 :(得分:0)
您可以使用compress
功能删除特殊字符,使用已定义的字符列表或“p”选项(删除所有标点符号/特殊字符)。为确保仅在开始/结束时删除它们,请使用substr
:
/* Assuming 'text' is always 3 or more characters */ data want ; set have ; strStart = substr(text,1,1) ; strEnd = substr(text,length(text),1) ; strMid = substr(text,2,length(text)-2) ; newStart = compress(strStart,,'p') ; /* remove all non-alphanumeric */ newEnd = compress(strEnd ,,'p') ; newStr = cats(newStart,strMid,newEnd) ; run ;
您可以将所有这些操作合并为一个语句。