【问题标题】:How to remove all foreign characters SAS如何删除所有外来字符SAS
【发布时间】:2020-02-25 02:50:46
【问题描述】:

我今天整天都在处理这个问题,到目前为止我在下面尝试过,但它仍然导致错误。错误显示

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

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;

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

谢谢

【问题讨论】:

  • 如果规则是只允许使用连字符或撇号,为什么还要保留 # $ 等? 's' 修饰符包括除空格以外的其他字符。
  • 取决于字母字符的定义,您的列表不包括 ÄÖÜßâ 等等,否则名称可能是错误的

标签: sas


【解决方案1】:

以下是从字符串中清除特定 ASCII 字符的方法。定义一个 FCMP 函数:

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 之前清除换行符:

data x;
 length employer $200;

 employer = cats("blah",byte(10),"diblah");
 employer = clean(employer);
run;

proc export data=x
             outfile="d:\test.csv"
             dbms=csv
             replace;
run;

注意 - 如果您有一个非常大的数据集和/或针对许多字段运行,此函数会非常慢。如果您的目标是非常具体的错误字符(例如可能影响 CSV 完整性的那些),那么您可能希望将字符列表减少到 2013 年 9 月 10 日字节。

【讨论】:

    【解决方案2】:

    这里有两种方法

    正则表达式

    PRXCHANGE 与包含括号 NOT (^) 字符类的正则表达式模式一起使用,指定哪些不匹配的字符将被替换为空 (//)。文字字符破折号 (-) 和撇号 (') 需要使用反斜杠 (\) 进行转义

    lastname = prxchange("s/[^A-Za-z\-\']//", -1, lastname);
    

    压缩要保留的字符列表

    compress 函数使用第三个参数形式指定压缩选项K 表示保留而不是删除。

    lastname = compress(lastname, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-'", 'K');
    

    【讨论】:

      猜你喜欢
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2017-09-01
      相关资源
      最近更新 更多