SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 793|回复: 7
打印 上一主题 下一主题

请教一个关于特殊字符的难题!? 还有点小担心,有风险

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-6-29 15:07:59 | 只看该作者

请教一个关于特殊字符的难题!? 还有点小担心,有风险

[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 都是'

请问各位这个问题有什么办法能解决的? 谢谢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-6-29 15:49:42 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-7-1 10:01:48 | 只看该作者

Re: 请教一个关于特殊字符的难题!?

thanks a lot for hopewell's help. 将特殊字符替换掉然后读入,最后再替换回来,是个不错的解决办法

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

其实我们有没有更好一点的解决方案来处理这类问题呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-7-1 13:18:44 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-7-1 15:31:55 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-7-1 16:54:44 | 只看该作者

Re: 请教一个关于特殊字符的难题!? 还有点小担心,有风险

hopewell 果然厉害,不过能解释一下自定义的procedure的大概思路吗?没看明白的说 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2010-7-1 17:00:38 | 只看该作者

Re: 请教一个关于特殊字符的难题!? 还有点小担心,有风险

谢谢sxlion,这个好像必须是所有field都是字符的才行,事实上我只列举了部分数据,全部一共有100多个field,类型包括字符型和数字型,而且是间隔开的,那个do 循环就遇到麻烦了。

最坏的时候需要一个一个field 来scan,然后转换类型,。。。。my godness
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2010-7-1 18:50:11 | 只看该作者

Re: 请教一个关于特殊字符的难题!? 还有点小担心,有风险

请列出所有的field,谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 04:59 , Processed in 0.068723 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表