楼主: yaoyinuo888
2660 8

[问答] 关于substr,怎么取出下面的数据。 [推广有奖]

  • 0关注
  • 0粉丝

硕士生

30%

还不是VIP/贵宾

-

威望
0
论坛币
1317 个
通用积分
0
学术水平
2 点
热心指数
2 点
信用等级
2 点
经验
1341 点
帖子
102
精华
0
在线时间
140 小时
注册时间
2016-6-26
最后登录
2022-2-8

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
附件里的这列数据,我想按如下要求提取数据:取出从第一个汉子开始,一直到第一个数字前的最后一个汉子为止的字符串。
比如数据里的前3行观测,我想提取出的字符串为:'浙江杭州市西湖区文一西路金色蓝庭'  '浙江杭州市余杭区荆山翠谷花苑'  '浙江杭州市拱墅区田园夏意苑‘
                                         
二维码

扫码加我 拉你入群

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

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

关键词:SUBSTR subs SUB UBS 最后一个

1.png (12.77 KB)

1.png

沙发
foocares 发表于 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;
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 30 + 30 + 2 + 2 + 2 热心帮助其他会员

总评分: 经验 + 30  论坛币 + 30  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

使用道具

藤椅
foocares 发表于 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就能运行正常得出结果。
哪位大神说说怎么回事?

使用道具

板凳
wwang111 发表于 2017-5-25 07:46:45 |只看作者 |坛友微信交流群
foocares 发表于 2017-5-25 05:59
这里一个有意思的地方是,我想自己造几个数据测一下,如果我这么写把所有逻辑放在一个数据步里:

data d ...
https://bbs.pinggu.org/thread-4815705-1-1.html
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
foocares + 1 + 1 + 1 精彩帖子
admin_kefu + 10 热心帮助其他会员

总评分: 论坛币 + 10  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

报纸
zwnSAS121 发表于 2017-5-25 09:15:37 |只看作者 |坛友微信交流群
  1. data a;
  2. length address $ 50;
  3. input address;
  4. cards;
  5. 浙江杭州市西湖区文一西湖金色蓝庭1-1-702
  6. 浙江杭州市余杭区荆山翠谷花苑57-3
  7. ;
  8. run;

  9. data b;
  10. set a;
  11. re=prxparse('/(\D*)(\d)/');
  12. if prxmatch(re,address) then
  13.         do;
  14.                 extract1=prxposn(re,1,address);
  15.                 extract2=prxposn(re,2,address);
  16.         end;
  17. run;
复制代码

使用道具

地板
foocares 发表于 2017-5-25 09:48:09 |只看作者 |坛友微信交流群
wwang111 发表于 2017-5-25 07:46
https://bbs.pinggu.org/thread-4815705-1-1.html
啊真是感谢呢,我都没注意到这条。

使用道具

7
yaoyinuo888 在职认证  发表于 2017-5-25 22:30:21 |只看作者 |坛友微信交流群
foocares 发表于 2017-5-25 02:20
楼主,你可以试试用ANYDIGIT(string )这个函数。
假如你的数据集格式全都像你这样列的类似,永远都是汉子开 ...
非常感谢,一口气把anydigit系列的函数都学了一遍,涨知识了。

使用道具

8
yaoyinuo888 在职认证  发表于 2017-5-25 22:38:36 |只看作者 |坛友微信交流群
zwnSAS121 发表于 2017-5-25 09:15
prxparse prxmatch prxposn 3个函数看晕了,有点难懂,有时间慢慢研究,谢谢帮助。

使用道具

9
albusdzx 发表于 2017-5-27 11:36:07 |只看作者 |坛友微信交流群
foocares 发表于 2017-5-25 05:59
这里一个有意思的地方是,我想自己造几个数据测一下,如果我这么写把所有逻辑放在一个数据步里:

data d ...
你把i=anydigit开始及下面的代码放到datalines之前  就行了

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 18:17