全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
5986 11
2009-06-19
各位高手:
我最近在处理一些文档数据。 有一列是存放往来邮件的。格式如下:
contents( this is column name)

[AR_ESCALATOR 31/12/2008 04:00:00 AM]
Status Change: "Resolved" to "Closed"
--------------------
[dgoh 30/11/2008 05:03:58 AM]
Status Change: "WIP" to "Resolved"
New Note:
Emailed and replied to the user xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--------------------
[dgoh 30/11/2008 04:46:30 AM]
New Note:
Ticket removed xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

====================(这是下一行的数据)
--------------------
[dgoh 30/11/2008 04:46:24 AM]
Individual Assignment Change: "NULL" to "Derek Goh"
Status Change: "Pending" to "WIP"
--------------------
[AR_ESCALATOR 04/12/2008 04:00:00 AM]
Status Change: "Resolved" to "Closed"
--------------------
[mang 02/12/2008 08:02:43 PM]
Status Change: "WIP" to "Resolved"
New Note:
no response from cx。 xxxxxxx
xxxxxxxxxx.

--------------------
========================================================
有时候数据是有------------------- 作分割的回复的电子邮件的, 有时候没有。

我的问题是:我只需要从“New Note"  到 日期之间的文字。 其他的不需要。
我只列出了两行数据。 有的时候回复的邮件可能很多。 这样需要从同一行中重复读取实际的文档内容。
不知道怎样处理才好。 希望高人指点。

不知道我的问题说清楚了没有。
多谢。
二维码

扫码加我 拉你入群

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

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

全部回复
2009-6-19 06:06:03
这个问题提的好,
二维码

扫码加我 拉你入群

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

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

2009-6-19 08:52:51
你的数据我没太看明白,所以不能直接写代码给你,不过你应当属于Reading Messy Raw Data,
给你一个example,你看是是否可以用,主要还是找规律,用"@"来定位,
例题如下,有下面这样的原始数据(例题来自little SAS book )
130.192.70.235 - - [08/Jun/2008:23:51:32 -0700] "GET /rover.jpg HTTP/1.1" 200 66820
128.32.236.8 - - [08/Jun/2008:23:51:40 -0700] "GET /grooming.html HTTP/1.0" 200 8471
128.32.236.8 - - [08/Jun/2008:23:51:40 -0700] "GET /Icons/brush.gif HTTP/1.0" 200 89
128.32.236.8 - - [08/Jun/2008:23:51:40 -0700] "GET /H_poodle.gif HTTP/1.0" 200 1852
118.171.121.37 - - [08/Jun/2008:23:56:46 -0700] "GET /bath.gif HTTP/1.0" 200 14079
128.123.121.37 - - [09/Jun/2008:00:57:49 -0700] "GET /lobo.gif HTTP/1.0" 200 18312
128.123.121.37 - - [09/Jun/2008:00:57:49 -0700] "GET /statemnt.htm HTTP/1.0" 200 238
128.75.226.8 - - [09/Jun/2008:01:59:40 -0700] "GET /Icons/leash.gif HTTP/1.0" 200 98
目的是为了找出时间和文件名称
DATA weblogs;
INFILE 'c:\MyWebLogs\dogweblogs.txt';
INPUT @ '['  AccessDate DATE11. @ 'GET'  File :$20.;
RUN;
PROC PRINT DATA = weblogs;
TITLE 'Dog Care Web Logs';
RUN;

意思是指在'[' 符号后面 为变量Accessdate 格式为Date11. 在'Get'后面为变量file,格式为冒号修订20个字符

不知道这个对你是否有帮助!
二维码

扫码加我 拉你入群

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

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

2009-6-19 21:56:46
多谢realgod5417. 不过我的问题是不可以指定变量的长度的。我需要的是抽取两个不同的位置之间的文本。
比如在你的例子中, 如果在 日期和GET之间有文本需要读出。  [09/Jun/2008:00:57:49 -0700] XXXXXXXXXXXXXXXXXXX"GET。 如何处理呢?
再比如, 如果有多个循环的文档在同一行中如何处理呢? 就像这样的:
[09/Jun/2008:00:57:49 -0700] XXXXXXXXXXXXXXXXXXX"GET-----  [09/Jun/2008:00:57:49 -0700] XXXXXXXXXXXXXXXXXXX"GET------ [09/Jun/2008:00:57:49 -0700] XXXXXXXXXXXXXXXXXXX"GET----
我觉得可能会用到index, substring 之类的先定位。
希望有人指点。
二维码

扫码加我 拉你入群

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

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

2009-6-19 23:07:50
这个其实也可以,你就@']' 后面尽可能包括你最长变量的一个字符串假设你最长的是20个那么你就定义为22或23个,那么一定包括了GET的前两个字母,
再用一个翻转函数reverse()把你定义出来的字符变量翻转,那么第二个或第三个字符一定是G,再用一个指示搜索函数indexc(G,s1)搜索s1中第一次出现第一个字符G的位置,然后再用计算字符长的的函数length(s1),计算s1的长度,最后用抽取函数substr(s,p,n)抽取第一次G字符出现的位置p到该字符的长的n,然后在翻转即可,

data tep1;
input @ "]"  varstring $25;/*j假设定义变量名称为varstring最长的包括GET或GE的字符为25个*/;

dataline;
.........................................
......................................

.....................................
;
run;
data tep2;
set tep1;
varnew=substr(reverse(varstring),indexc(reverse(varstring),"G")+1, length(reverse(varstring));
run;
最后varnew就是你要得到的字符变量.
方法可能有点笨,也许用sql过程回简单点,
但应当可行,其他过程其他高手解答.
学习ing
二维码

扫码加我 拉你入群

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

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

2009-6-20 05:05:18
Hi Realgod5417,
多谢你的解答。
你的思路主要在集中在如何提取变量名。 我的问题是如何提取不知长度的文本。文本的长度可能1000 以上。
我的数据来源是电子邮件。电子邮件包含了时间, 发信人,主题 和内容等。我只需要把内容提取出来做分析。
问题是如果回复同一主题的邮件比较多,如何把头尾去掉,只把内容取出来。
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群