全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3126 8
2017-05-24
附件里的这列数据,我想按如下要求提取数据:取出从第一个汉子开始,一直到第一个数字前的最后一个汉子为止的字符串。
比如数据里的前3行观测,我想提取出的字符串为:'浙江杭州市西湖区文一西路金色蓝庭'  '浙江杭州市余杭区荆山翠谷花苑'  '浙江杭州市拱墅区田园夏意苑‘
                                         
附件列表
1.png

原图尺寸 12.77 KB

1.png

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2017-5-25 02:20:59
楼主,你可以试试用ANYDIGIT(string <,start>)这个函数。
假如你的数据集格式全都像你这样列的类似,永远都是汉子开头(没有女子,汗),那么第二个参数start可以省掉。

假定你的数据集s1里这串地址信息变量叫addr, 那么i决定了第一个数字出现的位置,而c是对应取出来的子字符串:
data d1;
    set s1;
i = anydigit(addr);
if i >1 then
  c = substr(addr,1,i-1);
else
  c = '';
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-5-25 05:59:27
这里一个有意思的地方是,我想自己造几个数据测一下,如果我这么写把所有逻辑放在一个数据步里:

data d1;
   input addr $ @@;
   datalines;
s1 sb34 abc567
;
i = anydigit(addr);
if i >1 then
  c = substr(addr,1,i-1);
else
  c = '';

putlog c;
run;

SAS直接在i = anydigit(addr);那行报错,著名的180-322错误代码:
32   i = anydigit(addr);
     -
     180

ERROR 180-322: Statement is not valid or it is used out of proper order.

假如我在头一个数据步里只读dataline的数据进来,然后把其他逻辑分拆到另一个数据步里,比如这样:
data _null_;
set d1;
i = anydigit(addr);
if i >1 then
  c = substr(addr,1,i-1);
else
  c = '';

putlog c;
run;

SAS就能运行正常得出结果。
哪位大神说说怎么回事?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-5-25 07:46:45
foocares 发表于 2017-5-25 05:59
这里一个有意思的地方是,我想自己造几个数据测一下,如果我这么写把所有逻辑放在一个数据步里:

data d ...
https://bbs.pinggu.org/thread-4815705-1-1.html
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-5-25 09:15:37
复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-5-25 09:48:09
wwang111 发表于 2017-5-25 07:46
https://bbs.pinggu.org/thread-4815705-1-1.html
啊真是感谢呢,我都没注意到这条。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群