楼主: raymonica
5450 11

[原创博文] [求助]文本数据处理(电子邮件格式) [推广有奖]

  • 0关注
  • 1粉丝

硕士生

15%

还不是VIP/贵宾

-

威望
0
论坛币
23 个
通用积分
0
学术水平
2 点
热心指数
2 点
信用等级
0 点
经验
1277 点
帖子
238
精华
0
在线时间
43 小时
注册时间
2008-10-1
最后登录
2012-6-21

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
各位高手:
我最近在处理一些文档数据。 有一列是存放往来邮件的。格式如下:
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"  到 日期之间的文字。 其他的不需要。
我只列出了两行数据。 有的时候回复的邮件可能很多。 这样需要从同一行中重复读取实际的文档内容。
不知道怎样处理才好。 希望高人指点。

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

扫码加我 拉你入群

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

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

关键词:电子邮件 文本数据 数据处理 Individual assignment contents 电子 数据分析专题 数据处理 数据分析软件 数据分析报告 面板数据分析 excel数据分析 数据分析方法 项目数据分析

回帖推荐

realgod5417 发表于3楼  查看完整内容

你的数据我没太看明白,所以不能直接写代码给你,不过你应当属于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/20 ...

realgod5417 发表于5楼  查看完整内容

这个其实也可以,你就@']' 后面尽可能包括你最长变量的一个字符串假设你最长的是20个那么你就定义为22或23个,那么一定包括了GET的前两个字母, 再用一个翻转函数reverse()把你定义出来的字符变量翻转,那么第二个或第三个字符一定是G,再用一个指示搜索函数indexc(G,s1)搜索s1中第一次出现第一个字符G的位置,然后再用计算字符长的的函数length(s1),计算s1的长度,最后用抽取函数substr(s,p,n)抽取第一次G字符出现的位置p到该字符的长的 ...
已有 2 人评分论坛币 学术水平 热心指数 收起 理由
peijiamei + 1 + 2 精彩帖子
爱萌 + 20 + 1 这个问题提得好,大家可以讨论吗!

总评分: 论坛币 + 20  学术水平 + 2  热心指数 + 2   查看全部评分

本帖被以下文库推荐

沙发
爱萌 发表于 2009-6-19 06:06:03 |只看作者 |坛友微信交流群
这个问题提的好,
最恨对我说谎或欺骗我的人

使用道具

藤椅
realgod5417 发表于 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个字符

不知道这个对你是否有帮助!
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

梅须逊雪三分白雪却输梅一段香

使用道具

板凳
raymonica 发表于 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 之类的先定位。
希望有人指点。

使用道具

报纸
realgod5417 发表于 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
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

梅须逊雪三分白雪却输梅一段香

使用道具

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

使用道具

7
zhangyiduo 发表于 2009-6-20 17:27:41 |只看作者 |坛友微信交流群
看个这样的帖子收益匪浅啊

使用道具

8
realgod5417 发表于 2009-6-20 21:04:04 |只看作者 |坛友微信交流群
我明白你的意思了,你是想提取邮件的内容而不是邮件的信息,同一主题的来往邮件可能很多,你想把,来往信件的内容提取出来,然后分析.
另外一个不明确的地方,你想把来往信件的所有内容都放到一个变量里面,是嘛?也就是说这个变量可能超过1000,3000,甚至5000个字符,是这样嘛??
其实有的时候你不一定一次就完全提取出来的,你可以分别对每个邮件内容进行提取,然后在合并为一个变量也是可以的吧?
如果你不介意你可以发一个文本的例子,给我邮箱,我可以试试看
zhangjian5417@163.com
梅须逊雪三分白雪却输梅一段香

使用道具

9
marloneusa 发表于 2009-6-23 01:59:09 |只看作者 |坛友微信交流群
Here is the code from SAS Tech. you can try it.

data new;
  infile 'C:\Documents and Settings\painter\My Documents\SAS Code\Data\email.txt' truncover end=end;
  input @1 type $9.;
  length notes1-notes10 $100;

  /* create an array to hold the information following NEW NOTE: */
  /* adjust maximum number as needed - I choose 10 as the maximum number of lines to follow NEW NOTE: */

  array notes(10) $ notes1-notes10;

  /* look for the text NEW NOTE: */

  if upcase(type)='NEW NOTE:' then do;
    do i = 1 to dim(notes);

           /* input lines following NEW NOTE: */

          input notes(i) $100.;

            /* if you find - or are at the end of the file, drop out of the DO loop */

          if substr(notes(i),1,1)='-' or end=1 then i=dim(notes)+1;
    end;
  end;

  /* delete all records that are of TYPE=NEW NOTE: */

  if upcase(type) ne 'NEW NOTE:' then delete; proc print; run;

使用道具

10
raymonica 发表于 2009-6-23 02:11:18 |只看作者 |坛友微信交流群
Hi Realgod5417,
我发了一份测试数据给你。望查收。
我正在学习用perl regular expression. 试着用 prxparse , prxnext, substr 等。
我找到的规律是再New Note 和 [cjewett 30/11/2008 03:51:48 AM] 之间抽取文本。
我还没有找到 [cjewett 30/11/2008 03:51:48 AM]  的perl expression。
我是新手,还不太会编程。
希望多指点。

使用道具

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

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

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

GMT+8, 2024-5-2 02:55