我今天整天都在处理此问题,到目前为止,我在下面进行了尝试,但仍会导致错误。错误显示
“姓氏”字段只能包含字母字符,连字符或撇号。请删除所有外来字符并重新提交。
data APPLIED_GRAD1;
set APPLIED_GRAD;
last_name=compress(last_name,"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890`~!@#$%^&*()-_=+\|[]{};:',.<>?/ " , "kis");
pos_notalpha = notalpha ( TRIMN ( last_name )) ;
keep last_name;
run;
data APPLIED_GRAD2;
set APPLIED_GRAD1;
where pos_notalpha=0;
run;
我还能做些其他什么来删除所有外来字符吗?
谢谢
答案 0 :(得分:1)
这是从字符串中清除特定ASCII字符的方法。定义FCMP函数:
steps:
- bash: |
export d=$(date +%F)
echo "The Date is $d"
echo "##vso[task.setvariable variable=fileName]$d"
condition: eq( variables['Agent.OS'], 'Linux' )
- powershell: |
Set-Variable -Name d -Value (Get-Date).ToString('yyyy-MM-dd')
Write-Host "##vso[task.setvariable variable=fileName]$d"
condition: eq( variables['Agent.OS'], 'Windows_NT' )
用法示例-清洁行在导出为CSV之前中断:
proc fcmp outlib=work.funcs.funcs;
function clean(iField $) $200;
bad_char_list = byte( 0) || byte( 1) || byte( 2) || byte( 3) || byte( 4) || byte( 5) || byte( 6) || byte( 7) || byte( 8) || byte( 9) ||
byte(10) || byte(11) || byte(12) || byte(13) || byte(14) || byte(15) || byte(16) || byte(17) || byte(18) || byte(19) ||
byte(20) || byte(21) || byte(22) || byte(23) || byte(24) || byte(25) || byte(26) || byte(27) || byte(28) || byte(29) ||
byte(30) || byte(31) ||
byte(127)
;
iCleaned = translate(iField," ",bad_char_list);
return (iCleaned );
endsub;
run;
注意-如果您有非常大的数据集和/或针对许多字段运行此功能,则此功能非常慢。如果您定位的是非常具体的坏字符(例如可能影响CSV完整性的坏字符),则可能需要将字符列表减少为9/10/13个字节。
答案 1 :(得分:0)
有两种方法
正则表达式
将PRXCHANGE
与包含括号中的NOT(^
)字符类的正则表达式模式一起使用,该字符类指定哪些不匹配的字符将被替换为空(//
)。文字字符破折号(-
)和撇号('
)必须以反斜杠(\
)进行转义
lastname = prxchange("s/[^A-Za-z\-\']//", -1, lastname);
压缩要保留的字符列表
使用第三参数形式的compress
函数将压缩选项K
指定为keep而不是remove。
lastname = compress(lastname, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-'", 'K');