如何删除所有外来字符SAS

时间:2019-10-29 20:06:21

标签: sas

我今天整天都在处理此问题,到目前为止,我在下面进行了尝试,但仍会导致错误。错误显示

“姓氏”字段只能包含字母字符,连字符或撇号。请删除所有外来字符并重新提交。

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;

我还能做些其他什么来删除所有外来字符吗?

谢谢

2 个答案:

答案 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');
相关问题