楼主: 白太阳
3900 7

[问答] %str无法提取字符 [推广有奖]

  • 0关注
  • 0粉丝

大专生

58%

还不是VIP/贵宾

-

威望
0
论坛币
9 个
通用积分
0
学术水平
5 点
热心指数
5 点
信用等级
5 点
经验
484 点
帖子
11
精华
0
在线时间
100 小时
注册时间
2015-10-21
最后登录
2022-1-20

楼主
白太阳 发表于 2017-12-10 17:21:28 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请问,将药物名(均为中文字符,且其中部分包含小括号等符号),放入了一个宏变量,想用scan以及str函数一个个提取出来,但是%str无法识别,具体error见下图,请问是怎么回事呢,求赐教! 微信图片_20171210171943.png 微信图片_20171210171917.png 微信图片_20171210171835.png
二维码

扫码加我 拉你入群

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

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

关键词:Error scan err R函数

回帖推荐

lovexialulu 发表于4楼  查看完整内容

你弄复杂了吧,直接从原始数据集建宏变量 &cmlist1 - &cmlist&&n;

lovexialulu 发表于7楼  查看完整内容

出来的 &&cmlist&j 会有空格,你要先去掉,然后 if strip(cmtrt)="%sysfunc(strip(&&cmlist&j.))";

沙发
白太阳 发表于 2017-12-10 17:28:26
微信图片_20171210172738.png
这是部分药物名  跪求大神赐教!

藤椅
流水不朽 发表于 2017-12-11 09:53:12
在data步里面实现即刻
data   tmp;
     aaa='天晴甘平/阿奇霉素/.........';
     n=countw(aaa,'/');
     do i=1 to n;
         bbb=scan(aaa,i,'/');
     end;
run;

板凳
lovexialulu 发表于 2017-12-12 10:18:26
你弄复杂了吧,直接从原始数据集建宏变量 &cmlist1 - &cmlist&&n;

  1. data cm;
  2. length cmtrt $200.;
  3. cmtrt='aaaa';output;
  4. cmtrt='bbb';output;
  5. cmtrt='aaaaa';output;
  6. cmtrt='bbb';output;
  7. cmtrt='aaaa1';output;
  8. cmtrt='aaaa(1)';output;
  9. cmtrt='aaaa(67)';output;
  10. cmtrt='';output;
  11. run;

  12. proc sql noprint;
  13. select count(distinct cmtrt) into :n from cm where cmtrt ne '';
  14. select distinct cmtrt into :cmlist1 - :cmlist%sysfunc(strip(&n.)) from cm where cmtrt ne '' order by cmtrt;
  15. quit;
  16. %put &cmlist3. &cmlist6.;
复制代码

报纸
白太阳 发表于 2017-12-12 14:00:47
流水不朽 发表于 2017-12-11 09:53
在data步里面实现即刻
data   tmp;
     aaa='天晴甘平/阿奇霉素/.........';
感谢!但是我想要一个个读取,然后在宏里面对数据集进行set时,可以用这个语句: if 变量名= 某某药名来筛选使用不同药物的部分。在data步中的话好像不太方便......还是很感谢提供了这个思路!

地板
白太阳 发表于 2017-12-12 14:40:49
lovexialulu 发表于 2017-12-12 10:18
你弄复杂了吧,直接从原始数据集建宏变量 &cmlist1 - &cmlist&&n;
哇!谢大侠替我悬崖勒马。想要再问一下!我用这个思路跑了之后,每个cmlist就是一个药物名了,可是我跑以下程序的时候,报了warning,说是字符过长,可是一个药物名是不会超过260个字节的啊,很迷。
%macro cm();

%DO J= 1 %TO 5;

data cm&j.;
merge fas poweredc.cm;
by sid;
if cmtrt = "&cmlist&&j" ;
run;

%end;
%mend;
%cm();

WARNING: The quoted string currently being processed has become more than 262 bytes long.  You might have unbalanced  quotation marks.

7
lovexialulu 发表于 2017-12-12 16:03:02
白太阳 发表于 2017-12-12 14:40
哇!谢大侠替我悬崖勒马。想要再问一下!我用这个思路跑了之后,每个cmlist就是一个药物名了,可是我跑以 ...
出来的 &&cmlist&j  会有空格,你要先去掉,然后 if strip(cmtrt)="%sysfunc(strip(&&cmlist&j.))";

8
白太阳 发表于 2017-12-12 16:21:15
lovexialulu 发表于 2017-12-12 16:03
出来的 &&cmlist&j  会有空格,你要先去掉,然后 if strip(cmtrt)="%sysfunc(strip(&&cmlist&j.))";
解决了解决了!非常感谢!给大神打电话!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-5 00:05