SAS中文论坛

标题: 请教一个关于特殊字符的难题!? 还有点小担心,有风险 [打印本页]

作者: shiyiming    时间: 2010-6-29 15:07
标题: 请教一个关于特殊字符的难题!? 还有点小担心,有风险
[code:2gurf2cn]data a;
infile cards delimiter="|" MISSOVER DSD;
input x $ y $ z $ w $ s $ t $;
cards;
a'||3|'|'|9
c'|1||3|5|7
d'|7|8|8||4
;
run;[/code:2gurf2cn]

[color=#FF0000:2gurf2cn]a'[/color:2gurf2cn]||3[color=#FF0000:2gurf2cn]|'|'|[/color:2gurf2cn]9

源数据用'|'作为分隔符, 但是源数据比较特别,如红色部分, 有些字符是a' 有些单就一个单引号'  
但是和|就凑成了|'|'|, 于是SAS 读取的时候就出现了不希望的结果, 读到了一个| 而不是两个field 都是'

请问各位这个问题有什么办法能解决的? 谢谢
作者: shiyiming    时间: 2010-6-29 15:49
标题: Re: 请教一个关于特殊字符的难题!?
[code:14xf9otb]data a;
        infile datalines dlm='|' dsd;
        input @;
        _infile_=tranwrd(_infile_,"'",'@');
        input (x y z w s t) ($);
        array c _character_;
        do over c;
                c=tranwrd(c,'@',"'");
        end;
datalines;
a'||3|'|'|9
c'|1||3|5|7
d'|7|8|8||4
;[/code:14xf9otb]
作者: shiyiming    时间: 2010-7-1 10:01
标题: Re: 请教一个关于特殊字符的难题!?
thanks a lot for hopewell's help. 将特殊字符替换掉然后读入,最后再替换回来,是个不错的解决办法

但是我担心会存在这个一个风险,就是如果源数据本来就包含这个用来做替换的字符,这么一来回就会把原来那个@ 也换成了 ’(这个是我担心的存在风险)

其实我们有没有更好一点的解决方案来处理这类问题呢?
作者: shiyiming    时间: 2010-7-1 13:18
标题: Re: 请教一个关于特殊字符的难题!? 还有点小担心,有风险
都是DSD惹的。

试试这个:

[code:2du1pdxk]data a;
infile datalines ;
input  xx $20.;
   array yy(6) $ x y  z  w  s  t;
   do i= 1 to 6;
     yy[i]=scan(xx,i,'|','m');
   end;
drop xx i;
datalines;
a'||3|'|'|9
c'|1||3|5|7
d'|7|8|8||4
;
run;
proc print;
run;[/code:2du1pdxk]
作者: shiyiming    时间: 2010-7-1 15:31
标题: Re: 请教一个关于特殊字符的难题!? 还有点小担心,有风险
9.2有效
[code:3ps3bd74]proc fcmp outlib=work.func.quot;
        function quotation(in_str $,in_dlm $) $ 1024;
                outargs in_str;
                attrib sub_str length=$1024
                                out_str length=$1024
                                chr length=$1;
                in_str=cats(in_str,in_dlm);
                do i=1 to length(in_str);
                        chr=substr(in_str,i,1);
                        if chr in("'",'"') then flag=1;
                        if chr=in_dlm then
                                do;
                                        if flag=1 then sub_str=quote(strip(sub_str));
                                        out_str=strip(out_str)||','||strip(sub_str);
                                        sub_str='';
                                        flag=0;
                                end;
                        else sub_str=cats(sub_str,chr);
                end;
                return(substr(out_str,2));
        endsub;
run;

options cmplib = work.func;
data a;
        infile datalines dsd;
        input @;
        _infile_=quotation(_infile_,'|');
        input (x y z w s t) ($);
datalines;
a'||3|'|'|9
c'|1||3|5|7
d'|7|8|8||4
;[/code:3ps3bd74]
作者: shiyiming    时间: 2010-7-1 16:54
标题: Re: 请教一个关于特殊字符的难题!? 还有点小担心,有风险
hopewell 果然厉害,不过能解释一下自定义的procedure的大概思路吗?没看明白的说 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->
作者: shiyiming    时间: 2010-7-1 17:00
标题: Re: 请教一个关于特殊字符的难题!? 还有点小担心,有风险
谢谢sxlion,这个好像必须是所有field都是字符的才行,事实上我只列举了部分数据,全部一共有100多个field,类型包括字符型和数字型,而且是间隔开的,那个do 循环就遇到麻烦了。

最坏的时候需要一个一个field 来scan,然后转换类型,。。。。my godness
作者: shiyiming    时间: 2010-7-1 18:50
标题: Re: 请教一个关于特殊字符的难题!? 还有点小担心,有风险
请列出所有的field,谢谢!




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2