本發(fā)明涉及數(shù)據(jù)庫技術(shù)領(lǐng)域,尤其是涉及一種基于文本數(shù)據(jù)庫的檢索方法及系統(tǒng)。
背景技術(shù):
對(duì)于一些需要使用數(shù)據(jù)庫但是又不方便通過數(shù)據(jù)庫軟件來存取數(shù)據(jù)的場(chǎng)合,比如對(duì)于游戲的客戶端軟件,它往往擁有大量的配置文件,但是在客戶端中想要使用數(shù)據(jù)庫往往面臨著一些麻煩,比如需要在客戶端內(nèi)嵌入數(shù)據(jù)庫文件,對(duì)嵌入的數(shù)據(jù)庫文件需要加密,數(shù)據(jù)文本也需要加密等等。此時(shí)使用有純文本組成的文本數(shù)據(jù)庫往往要方便很多,但是對(duì)于文本數(shù)據(jù)庫的讀寫操作相較于應(yīng)用數(shù)據(jù)庫軟件而言就顯得很繁雜了,此時(shí)就需要一套對(duì)于文本數(shù)據(jù)庫的讀寫方式。本專利描述的是一種處理多個(gè)文本數(shù)據(jù)庫文件的數(shù)據(jù)載入讀取方法。
文本數(shù)據(jù)庫存儲(chǔ)在本地文件夾中,如果需要查找文本中的某一數(shù)值,則每次都臨時(shí)到對(duì)應(yīng)文件中去查找,那么效率上是不理想的,不能滿足實(shí)際需求;倘若把文本的內(nèi)容都存儲(chǔ)在內(nèi)存中,并且能夠以一種比較簡(jiǎn)便快捷的方式迅速查找到所需的值,但如果存儲(chǔ)方法不理想,往往得不償失。而且對(duì)于大批量的文件,倘若每一個(gè)文件都去編寫一個(gè)配套的讀取函數(shù),那工作量是驚人的,并且不利于后期的維護(hù)。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問題是:提供一種基于文本數(shù)據(jù)庫的檢索方案,可提高文件查詢效率,且降低工作量。
為了解決上述技術(shù)問題,本發(fā)明采用的技術(shù)方案為:提供一種基于文本數(shù)據(jù)庫的檢索方法,包括:
讀取文件中所有內(nèi)容到內(nèi)存中;
定義數(shù)組對(duì)象,逐行從內(nèi)存中讀取文件中的數(shù)據(jù)到數(shù)組對(duì)象中;
為數(shù)組對(duì)象建立行列索引;
根據(jù)所述行列索引,獲取文件內(nèi)容。
為解決上述問題,本發(fā)明還提供一種基于文本數(shù)據(jù)庫的檢索系統(tǒng),包括:
讀取模塊,用于讀取文件中所有內(nèi)容到內(nèi)存中;
定義模塊,用于定義數(shù)組對(duì)象,逐行從內(nèi)存中讀取文件中的數(shù)據(jù)到數(shù)組對(duì)象中;
索引模塊,用于為數(shù)組對(duì)象建立行列索引;
查詢模塊,用于根據(jù)所述行列索引,獲取文件內(nèi)容。
本發(fā)明的有益效果在于:區(qū)別于現(xiàn)有技術(shù),本發(fā)明通過讀取文件內(nèi)容到內(nèi)存中,并定義數(shù)組對(duì)象,從內(nèi)存中讀取數(shù)據(jù)到數(shù)組對(duì)象中,建立行列索引后,根據(jù)該索引,可快速獲取文件內(nèi)容。通過上述方式,本發(fā)明可以提高檢索效率,并降低工作量,節(jié)約人力。
附圖說明
圖1為本發(fā)明方法實(shí)施例一的流程示意圖;
圖2為本發(fā)明系統(tǒng)實(shí)施例二的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為詳細(xì)說明本發(fā)明的技術(shù)內(nèi)容、所實(shí)現(xiàn)目的及效果,以下結(jié)合實(shí)施方式并配合附圖予以說明。
本發(fā)明最關(guān)鍵的構(gòu)思在于:為所有文件建立行列索引,并根據(jù)索引進(jìn)一步檢索所需的內(nèi)容。
本發(fā)明主要是提供一種處理多個(gè)文本數(shù)據(jù)庫文件的數(shù)據(jù)載入讀取方案,請(qǐng)參照?qǐng)D1,本發(fā)明實(shí)施例一提供一種基于文本數(shù)據(jù)庫的檢索方法,包括:
s1:讀取文件中所有內(nèi)容到內(nèi)存中;
s2:定義數(shù)組對(duì)象,逐行從內(nèi)存中讀取文件中的數(shù)據(jù)到數(shù)組對(duì)象中;
s3:為數(shù)組對(duì)象建立行列索引;
s4:根據(jù)所述行列索引,獲取文件內(nèi)容。
具體地,本發(fā)明是通過c++語言實(shí)現(xiàn),并在步驟s1之前,將所有文件都看成是只具有行列屬性的一張表。應(yīng)當(dāng)說明的是,這是本發(fā)明在具體應(yīng)用中的一個(gè)抽象,所有文件都可以進(jìn)行這種抽象。文本數(shù)據(jù)庫可以被視為將一個(gè)數(shù)據(jù)庫內(nèi)的一張表的數(shù)據(jù)拷貝出來,然后存在.txt或者excel等文件中,文件內(nèi)容仍然可以視為一張表,但是如果要對(duì)表進(jìn)行檢索,利用sql就無法實(shí)現(xiàn)了,只能通過文件操作來進(jìn)行。隨后對(duì)于這張表構(gòu)造一個(gè)模板類class,class中提供打開文件并將文件的內(nèi)容按行列屬性存儲(chǔ)在內(nèi)存中的方法。方法具體實(shí)現(xiàn)過程如下:
1、打開文件,將文件內(nèi)的所有內(nèi)容讀到內(nèi)存中;
2、定義一個(gè)數(shù)組對(duì)象,保存文件的第一行數(shù)據(jù)(如第一行是列名,不是真實(shí)數(shù)據(jù))。聲明vector<char*>(即存儲(chǔ)空間大小可變的數(shù)組對(duì)象)對(duì)象col,聲明vector<vector<char*>>(可以看成是存儲(chǔ)空間可變的二維數(shù)組對(duì)象,每一行都是一個(gè)col對(duì)象,分n列)對(duì)象line,將內(nèi)存中的數(shù)據(jù)逐字段讀到col中,讀進(jìn)去的過程中需要檢查列值,若出現(xiàn)為空的列,用0表示,這么做的目的是在可變長(zhǎng)數(shù)組容器中,值的存儲(chǔ)是并列的,若出現(xiàn)空的值,會(huì)跳過這個(gè)值然后讀取下一個(gè)值,跳過的值不計(jì)數(shù),這樣就會(huì)出現(xiàn)列數(shù)不對(duì)應(yīng)的情況。待遇到換行符時(shí)代表一行讀取完畢,此時(shí)將col的內(nèi)容存入line的尾部保存下來,然后清空col中的內(nèi)容后繼續(xù)將新的一行數(shù)據(jù)讀到col中,依次循環(huán)直到全部讀取完畢,這樣處理,使得源文件的行和列的順序不會(huì)改變;
3、為line中的數(shù)據(jù)建立行列索引(純文本文件沒有索引概念),行索引的建立方式為:為每張表(即每個(gè)文件)人為定義一個(gè)集合,集合內(nèi)包含表的若干屬性值,這個(gè)集合被看成是對(duì)應(yīng)表的主鍵值,然后每一行都提取主鍵值與對(duì)應(yīng)的行號(hào)進(jìn)行組合成一個(gè)元素,再定義一個(gè)映射關(guān)系,映射關(guān)系通過主鍵進(jìn)行查找,返回此主鍵值所對(duì)應(yīng)的行號(hào),以此來定位已知主鍵值的一行數(shù)據(jù)所在行號(hào),然后在line中查找對(duì)應(yīng)行號(hào)的數(shù)據(jù),以獲得該行所有數(shù)據(jù),查找對(duì)應(yīng)行號(hào)的方法是根據(jù)數(shù)組自帶的下標(biāo)來獲?。涣兴饕慕⒎绞綖椋好總€(gè)文件的第一行固定為該表各列的屬性名,以屬性名和對(duì)應(yīng)的列號(hào)為組合,存入一個(gè)對(duì)象中,查找的時(shí)候通過屬性名為查找條件,得到該屬性所在的列號(hào)。行列索引的存在可以幫助程序快速定位到指定行列上。
例如:學(xué)生表.txt內(nèi)容如下:
則先將整個(gè)表的數(shù)據(jù)讀入內(nèi)存,然后將第一行(列名)存入數(shù)組colname中,從第二行開始至末尾都是有效數(shù)據(jù)。把第二行整行數(shù)據(jù)從內(nèi)存中讀出來按列(相鄰兩列間有特殊符號(hào)分隔,對(duì)應(yīng)編碼是’\t’)檢查處理好空值(比如上表第四行的性別,那就用0表示)后存入到數(shù)組col中(數(shù)組可以理解成一排連續(xù)的格子。這里再解釋下下標(biāo),假設(shè)對(duì)于第二行數(shù)據(jù)存入col后,對(duì)col[0]取值得到的就是張三,col[1]就得到“3”,col[4]得到“漢”,這個(gè)0、1、4就是下標(biāo)),再將col的內(nèi)容存入二維數(shù)組line中,然后清空col的內(nèi)容,再將下一行的數(shù)據(jù)處理好后存入col中,這樣一直循環(huán)到把全部有效數(shù)據(jù)都存到了line中,此時(shí)加入我獲取line[0],得到的就是一個(gè)以“張三312男漢”為內(nèi)容的數(shù)組,獲取line[0][0]即第0行第0列數(shù)據(jù),也就是“張三”。
接下來建立索引:行索引:假設(shè)定義姓名+年齡組成主鍵,那么索引的內(nèi)容第一行就是(張三,3)=1,第二行就是(李四,4)=2;列索引:內(nèi)容就是:姓名=1、年級(jí)=2…民族=5。
比如要查找5年級(jí)王五的性別,先通過5年級(jí)和王五定位行號(hào)為3,然后再定位性別為第四列,那么獲取line[2][3](下標(biāo)從0開始)就是所需值了。
應(yīng)用本發(fā)明后,從效率方面看:數(shù)據(jù)存儲(chǔ)在內(nèi)存中,需要查詢哪個(gè)數(shù)據(jù)可以借助行列索引快速得到。
建立索引只需要獲取主鍵屬性,這個(gè)在建立表文件的時(shí)候一般都需要設(shè)定主鍵,所以基本上不需要特別去獲取,只需要為每個(gè)文件定義好一個(gè)主鍵的類型就好了,然而為每個(gè)文件去編寫一個(gè)配套的讀取函數(shù)所需要的工作量就比這個(gè)大多了。
line是在內(nèi)存中的,一般會(huì)作為文件數(shù)據(jù)庫的數(shù)據(jù),大都不會(huì)出現(xiàn)比較長(zhǎng) 的內(nèi)容(比如一個(gè)字段里是一篇文章或者其他的很多內(nèi)容的數(shù)據(jù)),適用場(chǎng)合一般都傾向于文件字段多,但是值內(nèi)容不是很多的數(shù)據(jù),這種數(shù)據(jù)一個(gè)也才幾十k,一百個(gè)也不過幾m大小。
從工作量方面看:將所需要的方法都定義在了通用模板類中,免去了為每個(gè)表文件編寫一個(gè)讀取查詢函數(shù)的困擾,節(jié)約了人力。
如圖2所示,本發(fā)明實(shí)施例二提供一種基于文本數(shù)據(jù)庫的檢索系統(tǒng)100,包括:
讀取模塊110,用于讀取文件中所有內(nèi)容到內(nèi)存中;
定義模塊120,用于定義數(shù)組對(duì)象,逐行從內(nèi)存中讀取文件中的數(shù)據(jù)到數(shù)組對(duì)象中;
索引模塊130,用于為數(shù)組對(duì)象建立行列索引;
查詢模塊140,用于根據(jù)所述行列索引,獲取文件內(nèi)容。
其中,在實(shí)施之前,還需要將文件抽象成具有行列屬性的表,因此所述系統(tǒng)100還包括:
抽象模塊101,用于將文件抽象成具有行列屬性的表;
構(gòu)造模塊102,用于為所述表構(gòu)造模板。
其中,所述定義模塊120具體用于:
定義數(shù)組對(duì)象,包括存儲(chǔ)空間大小可變的數(shù)組對(duì)象col及l(fā)ine;
將所述表的第一行數(shù)據(jù)作為列名,并保存;
從第二行開始,從內(nèi)存中逐字段讀取所述表中的數(shù)據(jù)到數(shù)組對(duì)象col中,直至一行完畢;
保存數(shù)組對(duì)象col內(nèi)容到數(shù)組對(duì)象line尾部后,清空col中內(nèi)容;
進(jìn)入下一行,重復(fù)執(zhí)行步驟“從內(nèi)存中逐字段讀取所述表中的數(shù)據(jù)到數(shù)組對(duì)象col中,直至一行完畢”直至全部讀取內(nèi)存中內(nèi)容。
在上述讀取過程中,檢測(cè)列值是否為空;
若是,則忽略所述空列值,并不作計(jì)數(shù);
反之,則繼續(xù)讀取后續(xù)字段,直至讀取一行完畢。
所述索引模塊130具體用于:
建立行索引,具體地:
為所述表定義集合,對(duì)應(yīng)所述表的主鍵值,包括所述表的若干屬性值;
逐行提取主鍵值及對(duì)應(yīng)的行號(hào),以組合成元素,并定義對(duì)應(yīng)的映射關(guān)系;
建立列索引,具體地:
定義所述表的第一行數(shù)據(jù)為屬性名;
組合屬性名及對(duì)應(yīng)列號(hào),并存入數(shù)組對(duì)象col中。
以上所述僅為本發(fā)明的實(shí)施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等同變換,或直接或間接運(yùn)用在相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護(hù)范圍內(nèi)。