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