请选择 进入手机版 | 继续访问电脑版
楼主: StartoVer2
4008 11

完全的新手,关于字符串截取,求大家帮助 [推广有奖]

  • 0关注
  • 0粉丝

大专生

5%

还不是VIP/贵宾

-

威望
0
论坛币
49 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1195 点
帖子
23
精华
0
在线时间
41 小时
注册时间
2014-3-12
最后登录
2018-3-26

StartoVer2 发表于 2015-9-24 19:28:57 |显示全部楼层 |坛友微信交流群
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
现在要做的事情就是,一个变量,格式是:
“活泼开朗  四川  小红”
“勇敢  大方  湖南  小张”

类似于这样一列数据,需要把性格、地域、名字分成三列。
论坛里说可以用scan函数,但是因为性格的字符串里有的有空格,有的没空格,分隔符的数目不一定,所以不知道怎么样才能截取,或者如何从右往左截取?

完全没有编程基础,希望大神指点下啊。
二维码

扫码加我 拉你入群

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

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

关键词:字符串 scan 怎么样 不知道 编程基 字符串 四川 湖南 如何

StartoVer2 发表于 2015-9-24 21:21:18 |显示全部楼层 |坛友微信交流群
大神都到哪去了。。。

使用道具

teqel 发表于 2015-9-25 00:31:34 |显示全部楼层 |坛友微信交流群
scan 函数里面参数取负数就能从右向左

使用道具

StartoVer2 发表于 2015-9-25 08:58:36 |显示全部楼层 |坛友微信交流群
teqel 发表于 2015-9-25 00:31
scan 函数里面参数取负数就能从右向左
嗯嗯,这个我知道,但是每一行的分隔符数目并不相等。需要截取后两个,然后把所有剩下的放在一起。

使用道具

先从右往左截取省份和姓名,余下部分去掉空格就是性格。
省份和姓名再用scan截取。

使用道具

StartoVer2 发表于 2015-9-25 09:45:39 |显示全部楼层 |坛友微信交流群
孤单的我们 发表于 2015-9-25 09:26
先从右往左截取省份和姓名,余下部分去掉空格就是性格。
省份和姓名再用scan截取。
大神能把编码发出来吗。。现在只会截一个。。完整的代码不知道咋写

使用道具

cranewind 发表于 2015-9-25 12:06:18 |显示全部楼层 |坛友微信交流群
data A;
INPUT X $2 批量赋值宏变量——截取数据scan “天真 可爱 江苏 小刘”.txt (1.06 KB) 6.;
CARDS;
“活泼开朗  四川  小红”
“勇敢  大方  湖南  小张”
“天真  可爱  江苏  小刘”
;
RUN;
data A;
set A;
n=_n_;
run;
proc sql noprint;
select X
into :clist1-:clist999
from A;
quit;
%put &clist1.;
%put &clist2.;
%put &clist3.;
%macro delete_sign(n);
%do i=1 %to &n.;
data A&i;
set A;
if n=&i;
%put i is  &i.;
%put &&clist&i.;
Y=substr(substr("&&clist&i.",1,length(X)-2),3,length(X)-2);
run;
proc sql noprint;
select Y
into :clist&i.
from A&i;;
quit;
data A&i;
set  A&i;
if n=&i;
%put i is  &i.;
%put &&clist&i.;
y_3=compress(scan("&&clist&i.",-1,""));
y_2=compress(scan("&&clist&i.",-2,""));
y_4=compress(scan("&&clist&i.",-3,""));
y_5=compress(scan("&&clist&i.",-4,""));
y_1=compress(y_4||" "||y_5);
length y_1 $20.;
length y_2 $20.;
length y_3 $20.;
DROP y_4 y_5;
run;
%end;
%put &clist1.;
%put &clist2.;
%put &clist3.;
%do i=1 %to %EVAL(&n.-1);
data A%EVAL(&i+1);
set  A&i  A%EVAL(&i+1);
RUN;
%END;
data B;
set  A&i  ;
RUN;
PEOC DATASETS  NOPRINT;DELETE  A1-A&i.  ;QUIT;
%mend;

%delete_sign(3);

使用道具

StartoVer2 发表于 2015-9-25 12:48:53 |显示全部楼层 |坛友微信交流群
cranewind 发表于 2015-9-25 12:06
data A;
INPUT X $26.;
CARDS;
感谢cranewind的详细的回复~您这是用的宏吗。。我看不懂额。。如果想输出结果应该怎么修改捏??
刚运行了一下。。肿么有问题呃。。。

使用道具

cranewind 发表于 2015-9-25 13:31:26 |显示全部楼层 |坛友微信交流群
%delete_sign(3);  数据集有几行,3就改成几,循环的次数

使用道具

StartoVer2 发表于 2015-9-25 16:55:33 |显示全部楼层 |坛友微信交流群
cranewind 发表于 2015-9-25 13:31
%delete_sign(3);  数据集有几行,3就改成几,循环的次数
太谢谢您啦。。我最后还是用的笨办法。。scan(string,-1,' ');切开再用||合并一下,这样来做的。。您的方法我慢慢研究一下=。=因为目前水平太差看不明白。。

使用道具

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

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

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

GMT+8, 2024-3-29 00:25