楼主: 旧城少世
13133 17

[问答] 如何在sas中正确导入带分隔符的txt数据 [推广有奖]

  • 3关注
  • 0粉丝

硕士生

31%

还不是VIP/贵宾

-

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

30论坛币

亲们,我现在有这样一个txt格式的数据,数据之间是用‘|’分割的,变量名和其对应的值之间又是用”~“分割的,而且有的变量在对应的观测行是缺失的,请问我如何才能正确的导入?

我上午使用这个程序尝试了一下:
proc import datafile=   dbms=dlm replace;
delimiter="|"
getnames=no;
run;
但是导入进去以后,由于有的变量在某些航压根没有,所以导致了很多变量的值错位了,而且第二个问题变量和其对应的值我还不知道怎么提取出来?求大神们指教。。

Sample_Web_Log.txt

51.27 KB

关键词:txt delimiter replace delimit import replace import 如何 程序 而且

回帖推荐

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

最近超爱正则表达式,供参考~
沙发
旧城少世 学生认证  发表于 2015-11-14 11:32:46 |只看作者 |坛友微信交流群
数据样本,我最后需要的仅仅是红色标注的那几个变量。

QQ图片20151114112150.png (24.06 KB)

QQ图片20151114112150.png

使用道具

藤椅
teqel 发表于 2015-11-14 12:42:37 |只看作者 |坛友微信交流群
给你个程序,自己慢慢搬吧。有点笨的办法
  1. data A ;
  2. infile f1;
  3. LENGTH ID TIME_STAMP $20;
  4. LENGTH PAGE_NAME $50;
  5. input;
  6. A =tranwrd(tranwrd(_infile_, "ID~", "="), "TIME_STAMP~","=");
  7. ID=SCAN(SCAN(A, 2, "="), 1, "|");
  8. A =SCAN(A, 3, "=");
  9. A =tranwrd(A, "PAGE_NAME~", "=");
  10. TIME_STAMP = SCAN(SCAN(A, 1, "="), 1, "|");
  11. A =SCAN(A, 2, "=");
  12. A =tranwrd(A, "PORTLET_NAME~", "=");
  13. PAGE_NAME = SCAN(SCAN(A, 1, "="), 1, "|");
  14. A =SCAN(A, 2, "=");
  15. run;
复制代码

使用道具

板凳
木叶知秋 发表于 2015-11-14 18:37:42 |只看作者 |坛友微信交流群
最近超爱正则表达式,供参考~
  1. data test;
  2. infile "D:\Sample_Web_Log.txt" lrecl=1000 truncover;
  3. input strings $1000.;
  4. run;

  5. data test2;
  6.         length TIME_STAMP PAGE_NAME SESSION_ID PSDO_CUST_ID DEVICE_TYPE PLATFORM $100.;
  7.         pattern=prxparse('/.*TIME_STAMP~([\w\-]+)\|PAGE_NAME~([\w\.]+)\|.*SESSION_ID~(\w+)\|.*PSDO_CUST_ID~(\d+)\|(.*DEVICE_TYPE~(\w)\|.*PLATFORM~(\w)\|)?/o');
  8.         set test;
  9.         s=prxmatch(pattern,strings);
  10.         TIME_STAMP=prxposn(pattern,1,strings);
  11.         PAGE_NAME=prxposn(pattern,2,strings);
  12.         SESSION_ID=prxposn(pattern,3,strings);
  13.         PSDO_CUST_ID=prxposn(pattern,4,strings);
  14.         DEVICE_TYPE=prxposn(pattern,6,strings);
  15.         PLATFORM=prxposn(pattern,7,strings);
  16. run;
复制代码

已有 2 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 2 + 2 + 2 分析的有道理
teqel + 4 + 4 + 4 精彩帖子

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

使用道具

报纸
旧城少世 学生认证  发表于 2015-11-15 12:57:33 |只看作者 |坛友微信交流群
木叶知秋 发表于 2015-11-14 18:37
最近超爱正则表达式,供参考~
亲 分享一下正则表达式的一些资料哈~~~ 多谢

使用道具

地板
木叶知秋 发表于 2015-11-15 13:15:27 |只看作者 |坛友微信交流群
取自论坛 还于论坛~
正则表达式.rar (459.64 KB) 本附件包括:
  • 正则表达式2.pdf
  • 速查表.pdf
  • 正则表达式.pdf

使用道具

7
旧城少世 学生认证  发表于 2015-11-16 00:06:50 |只看作者 |坛友微信交流群
木叶知秋 发表于 2015-11-14 18:37
最近超爱正则表达式,供参考~
亲,我今天查了很多正则表达式资料,确实感觉此方法很强大啊,对你写给我的代码也认识了一些,不过有些地方还是不太怎么明白,还希望指导一下:
比如:prxparse('/.*TIME_STAMP~([\w\-]+)\|PAGE_NAME~([\w\.]+)\|.*SESSION_ID~(\w+)\|.*PSDO_CUST_ID~(\d+)\|(.*DEVICE_TYPE~(\w)\|.*PLATFORM~(\w)\|)?/o')
其中括号中/.../表示定义了一个正则表达式,.*表示匹配除换行符以外的一个或者多个任意字符,实际上就是代表了TIME_STAMP以前所有的字符串;([\w\-]+)匹配了多个\w\-格式的东西,就是把TIME_STAMP这个变量的相应取值替代了;接下来的\|实际上就表示得到了分界符|(不知道这儿理解对不对?);后面几个同理,不过最后的(.*DEVICE_TYPE~(\w)\|.*PLATFORM~(\w)\|)?没看明白,第一个疑惑就是为什么要把这两个变量括起来?第二个疑惑是最后的?能具体解释一下什么意思么? 在此先谢过了。。。

使用道具

8
木叶知秋 发表于 2015-11-16 10:41:13 |只看作者 |坛友微信交流群
旧城少世 发表于 2015-11-16 00:06
亲,我今天查了很多正则表达式资料,确实感觉此方法很强大啊,对你写给我的代码也认识了一些,不过有些地 ...
因为有些数据行包括这两个字段有些不包括,故用括号括起来加?,?表示括号中的出现0或者1次

使用道具

9
旧城少世 学生认证  发表于 2015-11-16 11:29:21 |只看作者 |坛友微信交流群
木叶知秋 发表于 2015-11-16 10:41
因为有些数据行包括这两个字段有些不包括,故用括号括起来加?,?表示括号中的出现0或者1次
嗯,还有个问题,\|是表示引入了一个|符号对吧? DEVICE_TYPE=prxposn(pattern,6,strings);
        PLATFORM=prxposn(pattern,7,strings);为什么是从6开始的,不应该匹配的组有6个,DEVICE_TYPE应该从第五个来查么?

使用道具

10
木叶知秋 发表于 2015-11-16 12:28:39 |只看作者 |坛友微信交流群
旧城少世 发表于 2015-11-16 11:29
嗯,还有个问题,\|是表示引入了一个|符号对吧? DEVICE_TYPE=prxposn(pattern,6,strings);
        PLA ...
1、因为|在正则表达式有特殊含义,因此用\|表示|
2、因为刚刚那个问题增加了()?,多了一个匹配组,这个匹配组为第5个匹配组

使用道具

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

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

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

GMT+8, 2024-4-26 20:19