宋娜娜
(鄭州航空工業(yè)管理學院信息科學學院,河南鄭州450000)
通過分析大量的企業(yè)信息系統(tǒng)產(chǎn)生的文本數(shù)據(jù)的異同點,從文本數(shù)據(jù)攜帶的信息和數(shù)據(jù)結構形式出發(fā),將文本數(shù)據(jù)文件結構歸納為:
文件名:在文件名中存在的一些重要數(shù)據(jù)應該被提取出來。
文件內(nèi)容:文本文件的內(nèi)容是最重要的部分,從結構上又可將文件的內(nèi)容分為表頭、表體、表尾三大部分。分別表示實際數(shù)據(jù)的不同方面,綜合起來則可以表示完整的無缺失的數(shù)據(jù)。
在對文本數(shù)據(jù)文件結構分析的基礎上,需要將這些數(shù)據(jù)的抽取規(guī)則[1]表示出來。文法是描述語言的語法結構的形式規(guī)則,這些規(guī)則是準確和易于理解的,而且有相當強的描述能力,足以描述各種不同的結構,上下文無關文法所定義的語法范疇是完全獨立于這種范疇可能出現(xiàn)的環(huán)境的[2],用上下文無關文法來表示數(shù)據(jù)抽取規(guī)則比較合適。
上下文無關文法包括四個組成部分:一組終結符號,一組非終結符號,一個開始符號以及一組產(chǎn)生式。
形式上講,一個上下文無關文法G是一個四元式(Vt,Vn,S,Φ),其中:
Vt是一個非空有限集,它的每個元素稱為終結符號;
Vn是一個非空有限集,它的第個元素稱為非終結符號,Vt∩Vn=φ;
S是一個非終結符號,稱為開始符號;
Φ是一個產(chǎn)生式集合(非空有限集),每個產(chǎn)生式的形式是P→a,其中,P∈Vt,a∈(Vt∪Vn)*。開始符號S至少必須在某個產(chǎn)生式的左部出現(xiàn)一次。
本文用::=代替→,用<>表示終結符號,用《》表示非終結符號。
大量的企業(yè)信息系統(tǒng)都有自己的一套文本數(shù)據(jù)文件名的生成規(guī)則,即在“.”后面放置有用的信息或在文件名的特定幾位上表示所需要的有用信息。
若在有用信息與其它信息之間有某種特定的分隔符,則以這個特定的分隔符為標記,提取出有用信息。若在有用信息與其它信息之間沒有特定的分隔符,而是在特定的位上放置有用信息,則指定信息提取的起始位置和長度,并取出有用信息。
文件名數(shù)據(jù)抽取規(guī)則的文法表示為:
《文件名》::=《按分隔符抽取》|《按位置抽取》
《按分隔符抽取》::=<分隔符號><從第幾個符號開始><至第幾個符號結束>《按分隔符抽取》
<分隔符號>::=某個特定符號
<從第幾個符號開始>::=開始分隔符編號(數(shù)字值)
<至第幾個符號結束>::=結束分隔符編號(數(shù)字值)
《按位置抽取》::=<數(shù)據(jù)開始位置><抽取數(shù)據(jù)長度>《按位置抽取》
<數(shù)據(jù)開始位置>::=數(shù)據(jù)在文件名中的開始位置值(數(shù)字值)
<抽取數(shù)據(jù)長度>::=需提取的數(shù)據(jù)長度(字符個數(shù),數(shù)字值)
將文件內(nèi)容的結構分為表頭、表體、表尾三部分分別進行研究。其中,表頭和表尾在某些文本數(shù)據(jù)文件中可能存在,也可能不存在,但表體作為表達數(shù)據(jù)信息的主體部分應該總是存在的。
作為基本結構的開始,表頭部分往往包含著以下信息:
⑴需濾掉的說明信息行:指整個數(shù)據(jù)塊的說明部分,包括數(shù)據(jù)來源、對應的報表名稱等。
⑵需保留的數(shù)據(jù)行:相對于之前需濾掉的多余信息,這部分信息是需要保存到數(shù)據(jù)庫中的。不論這部分數(shù)據(jù)量的大小,它們都將被抽取出來,并與后面的表體數(shù)據(jù)和表尾數(shù)據(jù)組合成一個完整的數(shù)據(jù)行。
對這些需保留的數(shù)據(jù)的抽取方法主要有以下兩種:
⑴從特定分隔字符后抽取指定長度的字符;
⑵從指定位置開始直接抽取指定長度的字符。
綜合以上的分析,可以得到描述表頭結構及抽取規(guī)則的文法如下:
《表頭數(shù)據(jù)》::=《行數(shù)據(jù)信息》《表頭數(shù)據(jù)》|《行數(shù)據(jù)信息》
《行數(shù)據(jù)信息》::=《開始標志行》|《需過濾數(shù)據(jù)行》|《需保留數(shù)據(jù)行》
《開始標志行》::=《包含特征字符串行》|《等于特征字符串行》|《匹配特征字符串行》
《需過濾數(shù)據(jù)行》::=《包含特征字符串行》|《等于特征字符串行》|《匹配特征字符串行》
《包含特征字符串行》::=<特征字符串><包含比較方法>
《等于特征字符串行》::=<特征字符串><等于比較方法>
《匹配特征字符串行》::=<特征字符串><匹配比較方法>
《需保留數(shù)據(jù)行》::=《按分隔符抽取》|《按位置抽取》
《按分隔符抽取》::=<分隔符號><從第幾個符號開始><至第幾個符號結束>
《按分隔符抽取》|<分隔符號><從第幾個符號開始><至第幾個符號結束>
<分隔符號>::=某個特定符號
<從第幾個符號開始>::=開始分隔符編號(數(shù)字值)
<至第幾個符號結束>::=結束分隔符編號(數(shù)字值)
《按位置抽取》::=<數(shù)據(jù)開始位置><抽取數(shù)據(jù)長度>《按位置抽取》|<數(shù)據(jù)開始位置><抽取數(shù)據(jù)長度>
<數(shù)據(jù)開始位置>::=數(shù)據(jù)在文件中的開始位置值(數(shù)字值)
<抽取數(shù)據(jù)長度>::=需提取的數(shù)據(jù)長度(字符個數(shù),數(shù)字值)
<特征字符串>::=字符串
<包含比較方法>::=判斷目標字符串是否包含特征字符串
<等于比較方法>::=判斷目標字符串是否等于特征字符串
<匹配比較方法>::=判斷目標字符串是否匹配特征字符串
表體部分作為數(shù)據(jù)的主體部分,包含著絕大部分需提取的信息,正確、高效地抽取出數(shù)據(jù)是進一步將數(shù)據(jù)加載到數(shù)據(jù)庫的關鍵[3]。表體數(shù)據(jù)包含了最終記錄中的主要字段值,它們主要通過兩種方式被抽取出來:
第一種是通過特定的分隔符將各字段值分隔開,常用的有逗號、“?”、“|”等符號,各字段值的長度不是固定的,對這種類型的數(shù)據(jù)在抽取時要識別出分隔符,并以這些特定的符號為邊界抽取各個字段。
第二種情況正好相反,各個字段值的長度是固定的,沒有特定的分隔符來分隔這些字段,對這類數(shù)據(jù)的抽取應當采取指定各個字段在數(shù)據(jù)行中的開始位置和長度的方法。
綜合這兩種情況,可以得到描述表體數(shù)據(jù)的結構和抽取規(guī)則的文法為:
《表體數(shù)據(jù)》::=《行數(shù)據(jù)信息》《表體數(shù)據(jù)》|《行數(shù)據(jù)信息》
《行數(shù)據(jù)信息》::=《需過濾數(shù)據(jù)行》|《標準數(shù)據(jù)行》|《需字段填充數(shù)據(jù)行》|《需組合數(shù)據(jù)行》|《需字段替換數(shù)據(jù)行》
《需過濾數(shù)據(jù)行》::=《包含特征字符串行》|《等于特征字符串行》|《匹配特征字符串行》
《包含特征字符串行》::=<特征字符串><包含比較方法>
《等于特征字符串行》::=<特征字符串><等于比較方法>
《匹配特征字符串行》::=<特征字符串><匹配比較方法>
<特征字符串>::=針對具體應用的字符串
<包含比較方法>::=判斷目標字符串是否包含特征字符串
<等于比較方法>::=判斷目標字符串是否等于特征字符串
<匹配比較方法>::=判斷目標字符串是否匹配特征字符串
《標準數(shù)據(jù)行》::=《按分隔符抽取》|《按位置抽取》
《按分隔符抽取》::=<分隔符號><從第幾個符號開始><至第幾個符號結束>《按分隔符抽取》|<分隔符號><從第幾個符號開始><至第幾個符號結束>
<分隔符號>::=某個特定符號
<從第幾個符號開始>::=開始分隔符編號(數(shù)字值)
<至第幾個符號結束>::=結束分隔符編號(數(shù)字值)
《按位置抽取》::=<數(shù)據(jù)開始位置><抽取數(shù)據(jù)長度>《按位置抽取》|<數(shù)據(jù)開始位置><抽取數(shù)據(jù)長度>
<數(shù)據(jù)開始位置>::=數(shù)據(jù)在文件中的開始位置值(數(shù)字值)
<抽取數(shù)據(jù)長度>::=需提取的數(shù)據(jù)長度(字符個數(shù),數(shù)字值)
《需字段填充數(shù)據(jù)行》::=《需填充字段》《需字段填充數(shù)據(jù)行》|《完整字段》《需字段填充數(shù)據(jù)行》|《需填充字段》|《完整字段》
《需填充字段》::=《按分隔符抽取》|《按位置抽取》
《完整字段》::=《按分隔符抽取》|《按位置抽取》
《需字段替換數(shù)據(jù)行》::=《需替換字段》《需字段替換數(shù)據(jù)行》|《完整字段》《需字段替換數(shù)據(jù)行》|《需替換字段》|《完整字段》
《需替換字段》::=《按分隔符抽取》|《按位置抽取》
《完整字段》::=《按分隔符抽取》|《按位置抽取》
《需組合數(shù)據(jù)行》::=《元素數(shù)據(jù)行》《需組合數(shù)據(jù)行》|《元素數(shù)據(jù)行》
《元素數(shù)據(jù)行》::=《按分隔符抽取》|《按位置抽取》
表尾數(shù)據(jù)部分和表頭部分數(shù)據(jù)類似,往往都包含著記錄行的一些關鍵字段,也有一些多余的無用信息需要被過濾掉,在此不贅述。
以上是對數(shù)據(jù)結構表示文法的分析。結合當前流行的XML語言的特點也可以使用XML來實現(xiàn)文本數(shù)據(jù)文件結構的表示文法。
[1] 蔣立源,康慕寧.編譯原理[M].西安:西北工業(yè)大學出版社,2005.
[2] 張云.談數(shù)據(jù)倉庫建設中的ETL過程[J].計算機系統(tǒng)應用,2005(8):36-37.
[3] 王曉東.計算機算法設計與分析[M].北京:電子工業(yè)出版社,2001.