楼主: lunix的昵称
5687 13

如何利用SAS提取Key=value数据格式中的value [推广有奖]

  • 0关注
  • 0粉丝

高中生

70%

还不是VIP/贵宾

-

威望
0
论坛币
5 个
通用积分
0.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
702 点
帖子
18
精华
0
在线时间
28 小时
注册时间
2014-5-15
最后登录
2025-3-15

楼主
lunix的昵称 发表于 2015-11-4 12:57:43 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

SAS中读取数据时,原始数据格式如下:











ASN=2,3;CEU=2;CHB=4,5,6;CHS=6,7


ASN=3;CEU=2,3;AFR=2,3;CHB=4,5;CHS=7,8


ASN=2,CEU=2,5;JPN=4,5,6;AFR=4,5,6;CHB=5,6,7


每一行包含的内容不一样,但是都是以Key=value的形式存储然后以;分割,我现在想提取出每一行CHB=后面的value,perl中好像有相应的方法来处理,但是自己不怎么擅长perl,所以请问各位高手在SAS中有什么好的办法吗?谢谢






二维码

扫码加我 拉你入群

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

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

关键词:value alue 数据格式 Key Perl 如何

回帖推荐

teqel 发表于10楼  查看完整内容

简单一点: data a; input; chb = scan(scan(tranwrd(_infile_,"CHB=","|"),2,"|"),1,";"); datalines4; ASN=2,3;CEU=2;CHB=4,5,6;CHS=6,7 ASN=3;CEU=2,3;AFR=2,3;CHB=4,5;CHS=7,8 ASN=2;CEU=2,5;JPN=4,5,6;AFR=4,5,6;CHB=5,6,7 ;;;; run;

木叶知秋 发表于11楼  查看完整内容

正则表达式小试牛刀:

teqel 发表于8楼  查看完整内容

确实不行,试试这个

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

data a; infile "H:\test.txt" truncover; input b $100.; run; proc print; run; data c; set a; l1=find(b,'CHB=','i'); d=substr(b,l1+4); l2=findc(d,"ACJ"); if l2>0 then e=substr(d,1,l2-2); else e=d; run;

沙发
yang1015661763 发表于 2015-11-4 15:21:31
SAS 有个substr函数,你可以在sql过程中 弄一下试试

藤椅
lunix的昵称 发表于 2015-11-9 10:13:38
yang1015661763 发表于 2015-11-4 15:21
SAS 有个substr函数,你可以在sql过程中 弄一下试试
substr 一般的用法是 substr(variable, position, length), 但是该数据首先的一个问题是,每一行的变量的个数和位置不一样,所以需要
1. 根据Key来定位到自己想要的变量
2. 然后再提取出来该变量后面的value(这个时候或许可以用到substr,但也会有一些问题,比如每个变量的长度不是固定的,没有办法制定substr中的length的大小)。

板凳
lqyrendajinji 发表于 2015-11-10 05:06:18
data a;
infile "H:\test.txt" truncover;
input b $100.;
run;

proc print; run;

data c; set a;
        l1=find(b,'CHB=','i');
        d=substr(b,l1+4);
        l2=findc(d,"ACJ");
        if l2>0 then e=substr(d,1,l2-2);
        else e=d;
run;

报纸
teqel 发表于 2015-11-10 06:22:57 来自手机
试试input with named

地板
lunix的昵称 发表于 2015-11-10 13:12:17
lqyrendajinji 发表于 2015-11-10 05:06
data a;
infile "H:\test.txt" truncover;
input b $100.;
很聪明的方法,谢谢!
不过在I2=findc(d,"ACJ");这个命令中ACJ是你根据我提供的三行数据总结出来的三种情况,事实上原始数据有3个G,后面不一定局限于“ACJ”三种情况。
我自己找到一个办法,你可以参考下:
data a;
infile "H:\test.txt" truncover;
input b $100.;
run;

data c; set a;
        chb = scan(scan(tranwrd(b,"CHB=","|"),2,"|"),1,";");
run;

7
lunix的昵称 发表于 2015-11-10 13:15:46
teqel 发表于 2015-11-10 06:22
试试input with named
你是说在读入数据的时候就读入变量的Name吗?但是该数据本身以分号分割的话,每一列不一定是一样的内容

8
teqel 发表于 2015-11-11 00:27:22
lunix的昵称 发表于 2015-11-10 13:15
你是说在读入数据的时候就读入变量的Name吗?但是该数据本身以分号分割的话,每一列不一定是一样的内容
确实不行,试试这个
  1. data a;
  2. infile datalines4 dsd dlm=';' missover;
  3. keep CBH;
  4. length CBH $15;
  5. informat a1-a5 $12.;
  6. input a1-a5 $;
  7. array a{5} a1-a5;
  8. do i=1 to dim(a);
  9.         if index(a[i], 'CHB=')>0 then CBH=substr(a[i], 5);
  10. end;
  11. datalines4;
  12. ASN=2,3;CEU=2;CHB=4,5,6;CHS=6,7
  13. ASN=3;CEU=2,3;AFR=2,3;CHB=4,5;CHS=7,8
  14. ASN=2;CEU=2,5;JPN=4,5,6;AFR=4,5,6;CHB=5,6,7
  15. ;;;;
  16. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
lunix的昵称 + 1 + 1 + 1 精彩帖子

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

9
teqel 发表于 2015-11-11 02:17:04
lunix的昵称 发表于 2015-11-10 13:12
很聪明的方法,谢谢!
不过在I2=findc(d,"ACJ");这个命令中ACJ是你根据我提供的三行数据总结出来的三种情 ...
这个不错

10
teqel 发表于 2015-11-11 02:20:44
lunix的昵称 发表于 2015-11-10 13:12
很聪明的方法,谢谢!
不过在I2=findc(d,"ACJ");这个命令中ACJ是你根据我提供的三行数据总结出来的三种情 ...
简单一点:

data a;
input;
chb = scan(scan(tranwrd(_infile_,"CHB=","|"),2,"|"),1,";");
datalines4;
ASN=2,3;CEU=2;CHB=4,5,6;CHS=6,7
ASN=3;CEU=2,3;AFR=2,3;CHB=4,5;CHS=7,8
ASN=2;CEU=2,5;JPN=4,5,6;AFR=4,5,6;CHB=5,6,7
;;;;
run;

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 11:49