OpenFEA技巧篇 | 文本分割

原创
2016/12/30 09:57
阅读数 494

您还在为无法分析文本数据,无法提取文本文件中有价值的内容而头疼吗?也许用FEA能帮助您解决问题。我先进行抛砖引玉,先讲解如何用FEA分割文本文件,以下是一个名字为access_log_for_pands.txt的文本文件(数据来源于网络),内容为网站访问日志,格式如下:

一、数据加载

要提取有价值的数据,无论怎么样都要先导入数据到FEA中。我们使用FEA加载数据原语:apache=load csv by access_log_for_pandas.txt with (sep="$",header=-1) ,把整个1.74M大小文件加载FEA引擎中,并使用dump apache命令查看加载完成的数据,如下图:

二、数据分割技巧

FEA通常会使用“字符串函数处理str”原语中split、slice函数对字符列进行分割,也可以通过lambda函数对字符串进行分割,原语格式如下:

df表.新列名=str 被处理列名 by (split\slicce(正则表达式))|df表.新列名=lambda 被处理列名 by (x:表达式) 

下面开始简单介绍几个分割技巧。

注意:目前str原语命令一共还支持其他15种不同类型函数,cat、contains、count、endswith\startswith、findall、get、jion、len、lower\upper、match、pad、center、repeat、replace、strip\rstrip\lstip(想查看详细的函数说明信息,请访问http://www.openfea.cn/xiazaibanben.html目录下载《原语手册》)文件。

(一)split 根据特定字符分割字符串

观察dump apache展示出来的数据结果,我们发现将日志通过 ‘ - - ’字符串进行分割,使用以下原语完成分割:

rename apache as (0:”s”) 

apache.x=str s by (split(' - - '))

apache.x0=str x by (get(0))

apache.x1=str x by (get(1))

apache=loc apache by (s,x0,x1)

执行完以上原语后,使用dump apache查看数据结构。

恭喜你,你已经分割成功。

注:我们来总结一下split函数使用办法,示例如下:

apache.x=str s by (split('-'))      #以-为特殊字符,对s列值进行分割。

apache.x=str s by (split(' - - '))    #以 - - 为特殊字符串,对s列值进行分割。

apache.x=str s by (split(' -',1))    #以-为特殊字符,对s列的值只分割一次。

apache.x=str s by (split(' -',3))    #以-为特殊字符,对s列的值分割三次。

请同学们自己去测试,以上四种语句分割是有不同效果的。

(二)slice函数 截取字符串

经过前面的split函数分割后我们把字符串s列分成了x0,x1两列。为了演示slice分片功能,结合我们的目标是把x0列URL与IP再进行分割,做如下示例:

apache.y=str x0 by (slice(1,21))

apache.y1=str x0 by (slice(22, ))

apache=loc apache by (s,y,y1,x1)

执行完以上原语后,使用dump apache查看数据结构。

我们已经对x0分割完成了,当然你对x0列进行分割,同样可以使用split函数,不一定使用slice函数。

注:我们来总结一下slice函数使用办法,示例如下:

apache.y=str x0 by (slice(None,None,-1 ))  #对x0进行倒序

apache.y1=str x0 by (slice(-1,-20,-1 ))     #从最后一个字符,到倒数第20个字符

apache.y2=str x0 by (slice(-20,-5,2 ))     #从倒数第20字符,到倒数第5个字符,2个字符一跳转

(三)lambda 分割

与split和slice不同,本节讲使用lambda函数进行分割,但是道理都是一样的,都是使用split函数与slice函数,只是语法格式不一样而已。

通过slice函数的处理,我们已经把前半部分x0分割完毕,现在我们要分割x1字符串了,示例如下:

apache.z=lambda x1 by (x:x.split("] ",1)[0][1:-1])     

apache.z1=lambda x1 by (x:x.split("] ",1)[1])   

apache=loc apache by (s,y,y1,z,z1)

执行完以上原语后,使用dump apache查看数据结构。

通过lambda表达式,我们完成了对x1的分割,如果你还想继续把Z1分割下去,那同学们请自己动手动脑。

注:我们来总结一下lambda函数使用办法,示例如下:

apache.z=lambda x1 by (x:x.split("] ",1))   #以] 对字符串x1进行分割,得到一个list

apache.z=lambda x1 by (x:x.split("] ",1)[0][::-1]) #以] 对字符串x1进行分割,取得list第一个值后在倒序。

三、总结

通过对文本不断的分割,就能提取到有用的信息进行分类统计分析。像本示例就可以通过分割,提取到有哪些ip访问本网站,使用什么浏览器访问,访问最多的网页是哪些等相关信息。

最后总结,请同学们一定要记住两个原语:

df表.新列名=str 被处理列名 by (split\slicce(正则表达式))

df表.新列名=lambda 被处理列名 by (x:表达式)

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部