字串處理(String Parsing)簡單說就是將一堆文字(包括符號、數字等)清理、整理後擷取我們需要的部份;以“輕鬆用VBA做網路爬蟲(上)” 最後的小挑戰做例子的話,可以(跟面試官)說我們是在開發處理玩股網報價的演算法。
開發一個網路爬蟲時,大概有八成以上的時間都在做字串處理,
在這篇文章中我會用網路爬蟲“上篇”中最後的小挑戰作為例子,
再用一個線上的字庫讓大家練習一下。
200.32▲3.861.96%
108.47▲2.011.89%
134.03▲2.41.82%
130.71▲2.341.82%
113.09▲1.861.67%
82.59▲1.161.42%
208.67▲2.581.25%
160.88▲1.941.22%
484.47▲5.691.19%
380.09▲4.31.14%
263.25▲2.921.12%
首先,我們在被證明錯誤前先找找其中自以為的規律:「
1. 指數報價一定都到小數點後兩位;
2. 指數報價後會跟著上漲▲或下跌▼的符號,平盤時沒有符號(某天看見的);
3. 當天漲跌(有負號)一定都到小數點兩位,平盤時為0(某天看見的);
4. 不論當天漲跌(有負號),漲跌幅一定到小數點後兩位(eg. x.xx%)。」
因此,萃取指數報價的方式就是:「
找到第一個"."的位置(假設為n),然後抓第1位~第n+2位,
也就是 Left( 原始資料, inStr( 1, 原始資料, "." )+2 )。」
再來,萃取指數漲跌的方法稍微複雜點:「
【先看原始資料中是否有那兩個符號,有的話:「
首先,我們知道指數報價的結尾在n+2處,
因此我們新創一個從n+3開始的資料叫做"改動資料",
改動資料= Right( 原始資料, (len( 原始資料) -(n+2)) ),
所以,我們一樣找改動資料中第一個"."的位置(假設為m),然後抓第1位~第m+2位就行了,
也就是 Left( 改動資料, inStr( 1, 改動資料, "." )+2 )。」
如果找不到▲或▼的符號,那當日漲跌就是0了。】」
最後是當日漲跌幅:「
如果當日漲跌不為0,那麼改動資料的第m+3位~最後一位就是漲跌幅了,
也就是Right( 改動資料, (len( 改動資料) -(m+2)) )。
當日漲跌為0的話,漲跌幅自然也為0( 0.00%)了。」
========================================================
以下是另一個字串處理+網路爬蟲的例子
========================================================
我們要嘗試著計算出A開頭字庫中各種詞性(part of speech)佔的數目,
原始碼大致上長這樣子:「
<P><B>Abacinate</B> (<I>v. t.</I>) To blind by a red-hot metal plate held before the eyes.</P>
<P><B>Abacination</B> (<I>n.</I>) The act of abacinating.</P>
<P><B>Abstaining</B> (<I>p. pr. & vb. n.</I>) of Abstain</P> 」
單字被<B>標籤包住、詞性則被<I>標籤包住,
除此之外一個單字可能會有多個詞性(在<I>標籤裡面被&符號分開)。
(註:實作後才發現有極少數的多詞性會被“ /” 以及“ ,” 符號分開)
爬蟲的前置除了網址不一樣外,其它的與上篇文章都一樣,
以下是抓取詞性的code:「
圖1:
圖2:
圖3:
理論上,運行完後我們得到的資料大概會長這樣(部份):
Part of Speech
|
numbers
|
prep.
|
70
|
n.
|
5444
|
a.
|
2861
|
v.t.
|
1088
|
adv.
|
574
|
pl.
|
239
|
p.p.
|
317
|
imp.
|
287
|
p.pr.
|
285
|
vb.n.
|
285
|
v.
|
67
|
v.i.
|
278
|
n.pl.
|
171
|
superl.
|
10
|
i.
|
44
|
p.a.
|
7
|
a
|
2
|
interj.
|
15
|
p.p.Adored(/);p.pr.
|
1
|
a.superl.
|
2
|
Aprefix.
|
3
|
conj.
|
26
|
網路爬蟲中,字串處理的部份大致上就是這個樣子。
以下是範例檔案(附code):
字串處理是一門相當重要的功夫,
無論是做資料分析、語意分析、或甚至要暴力破解某個密碼都會用到它,
而有些問題只有在實作後才會被發現,
建議大家多多找出生活、工作中可以被自動化的工作,試著動手開發。
有任何問題歡迎來信或者留言,
如果想自動化一件工作卻毫無頭緒也可以來信我們討論看看,
IT'S ALL FREE !!