文檔內容查找器【安利一個自己搞的黑科技】


某日 zjq 菜雞閑來無事(好吧是出於某種目的,但也不好告訴你),就東拼西湊搞了一份代碼

這份代碼可以方便的對於一些文檔進行搜索處理,並且有着良好的擴展性(好吧這句話的意思就是 zjq 只弄了個搜索功能)

其實類似的功能幾乎每個文檔軟件里面都有,然而當文件數量越來越多的時候,光是打開他們就足夠讓文檔編輯軟件崩潰了...更別提批量查找了

於是咱自個兒想辦法...

講道理,咱搞 OI (禿頭)界的咋能不會點能夠便利生活的小操作呢...

然鵝咱還真的不會,於是就只能上網搜索各種操作的實現方法,比如說 獲取一堆文件名,以及在這些文件中查找指定內容(雖說后面這個咱自己弄也弄得起來...不過網上的方法說不定效率高呢!雖說最后並沒有發現效率上的區別...但咱還是照着網上的搞法來了...)

於是乎一份文檔批量搜索指定內容的 code 就出 爐了!

//by Judge
#include<bits/stdc++.h>
#include<io.h>
using namespace std;
vector<string> files; char str[30]; string s;
char filePath[999]="E:\\Test";
void getFiles(string path,vector<string>& files){
	long nowFile=0; string p;
	struct _finddata_t fileinfo;
	if((nowFile=_findfirst(p.assign(path).append("\\*").c_str(),&fileinfo))!=-1){
		do{
			//如果是目錄,向下迭代 
			if((fileinfo.attrib&_A_SUBDIR)){
				if(strcmp(fileinfo.name,".")!=0&&strcmp(fileinfo.name,"..")!=0)
					getFiles(p.assign(path).append("\\").append(fileinfo.name),files);
			} else //否則加入列表 
				files.push_back(p.assign(path).append("\\").append(fileinfo.name));
		}while(_findnext(nowFile,&fileinfo)==0);
		_findclose(nowFile);
	}
}
inline bool Find(char* s,string obj){
	ifstream fi(s,ofstream::in); string buf;
	if(fi.is_open()){
		while(fi>>buf) if(buf.find(obj)!=-1) return 1;
		fi.close();
	} return 0;
}
int main(){
	getFiles(filePath, files ); //獲取該路徑下的所有文件 
	int size = files.size();
//	有需要的可以直接輸出所有帶路徑的文件名 
//	for (int i = 0;i < size;i++)
//		cerr<<files[i].c_str()<<endl;
	string object="Judge";
	char str[999]; int cnt=0;
	for(int i=0;i<size;++i){
		strcpy(str,files[i].c_str());
		if(Find(str,object))
			cerr<<files[i].c_str()<<endl,++cnt;
	}
	if(cnt>0) cerr<<"Find "<<cnt<<" Result(s)!"<<endl;
	else cerr<<"Failed Find Any Thing!!!"<<endl;
	return 0;
}

這樣 就可以用這份代碼方便的去查找一堆小說 文檔里面內容辣~ QWQ (並沒有意識到自己暴露了什么的 zjq )

然后插一句,這個東西可以查找文件的條件就是,那個文件被 txt 打開后能呈現出你想找的內容(應該是這樣的?)

具體怎么實現咱就不說了, OIer 們雖說自己不一定能打的出來,但是學習(或者說理解?)代碼什么的比起小白來說還是有着挺大的優勢的吧...

但考慮到真正的小白對於這份代碼可能並不能了解....QWQ

於是咱稍微講講用法(實現講個鬼啊,里面一堆函數咱也不知道具體是個啥子的好伐?):

首先把第 行的那個 filePath 后面跟的字符串(對,就是 "E:\\Test" )改成你想要搜索的文件夾的路徑(只要在文件夾上面的地址欄里復制一下就好了),這里稍微注意一下,反斜杠都是要兩個的,因為...哎, OIer 自己能懂,別人咱說了也沒啥用...反正一個反斜杠改成倆就好咯

其次就是把 main 函數里面的第 行的 object 后面跟的字符串(對,就是 "Judge" )改成你要搜索的內容(可以是中文,另外上面的路徑里面也同樣可以有中文)

最后是最重要的,如果您不是搞 C++ 的,得裝個 dev cpp ... 這個,咱給個鏈接總行了吧...安裝咱也不教了... 地址點這里

順便提一個可喜的發現: 菜雞 zjq 把存儲漢字的兩個 char 轉 int 輸出后驚奇的發現它們是負數,或許這就是字符存儲漢字的方式...並且可以存大概 2 的 15 次種漢字,遠遠超過了漢字的總字數(當然明朝那些一個個都是造字巨佬的貴族搞出來的神仙字咱可不算進去哈,雖說算進去了應該也是放的下的 QWQ )

ojbk...原本這玩意兒咱想拿到 csdn 上去賣的,但最后還是覺得拿出來分享好了,順便提一句: 未經作者同意,請勿傳播此代碼...(當然網址是可以分享噠~ )

求推薦,求收藏,求分享 ღ( ´・ᴗ・` )

Update

有位小老弟來問咱,如果要搜索指定文件類型的文檔內的內容怎么實現...

於是咱就修改了一個小地方...就是 getFiles 里面,咱直接把修改完的代碼放上來吧... QWQ

void getFiles(string path,vector<string>& files){
	long nowFile=0; string p,q;
	struct _finddata_t fileinfo;
	if((nowFile=_findfirst(p.assign(path).append("\\*").c_str(),&fileinfo))!=-1){
		do{
			//如果是目錄,向下迭代 
			if((fileinfo.attrib&_A_SUBDIR)){
				if(strcmp(fileinfo.name,".")!=0&&strcmp(fileinfo.name,"..")!=0)
					getFiles(p.assign(path).append("\\").append(fileinfo.name),files);
			} else{ //否則加入列表 
				q=fileinfo.name;
				if(q.find(".json")!=-1) files.push_back(p.assign(path).append("\\").append(fileinfo.name));
			}
		}while(_findnext(nowFile,&fileinfo)==0);
		_findclose(nowFile);
	}
}

慢慢對比,尼會發現哪里改掉了的 QWQ ,然后這里是以 .json 的文件類型為例的

翻新一下,給個 PY 版的 code:

增加了一個輸出文檔附近內容的功能...然鵝並沒有什么軟用,上面的 c++ 代碼改兩下也就有了,關鍵是 PY 比較短?



import os
import re

# -*- coding: utf-8 -*-

def getFiles(Path):
    Res=[]
    for root,dirs,files in os.walk(Path):
        for file in files:
            Res.append(root+'\\'+file)
    return Res


def changeCode(Path):
    # 實在抱歉,該板塊如果要寫的話還需要下載函數庫,所以就算了...
    # 所以說如果要安全使用本代碼需要把 gbk 編碼的文件轉化成 utf ...
    # 關於怎么轉換...您可以網上下個批量轉換器
    return 


def Find(Path, reg):
    # 如果說是查找沒有編碼轉換過的 gbk 文檔的話要改成: encoding='gbk'
    # 這里用了 utf ,雖說貌似一般來講咱都是用的 gbk
    # 反正一個不管用試試另一個就好了
    content=open(Path,'r',encoding='utf-8',errors='ignore' ).read()
    Res=reg.match(content)
    if Res==None:
        return False
#    print(Res.groups())
# 如果這里要輸出的話也只會輸出一個(應該是最前面的那個),況且有時全部輸出太亂了...
    return True

if __name__=='__main__':
    filePath='F:\\PY\\TXT'
    changeCode(filePath)
    files=getFiles(filePath)
#    for file in files:
#        print(file)
    reg=r'.*Judge.*'
    # 如果僅僅是想知道哪些文檔里面有查詢內容的話這句就夠了
    # 如果還想要知道關鍵字附近的內容的話下面一句話可以實現
#    reg=r'.*?(.{0,20}Judge.{0,20}).*'
    reg=re.compile(reg,re.S)
    cnt=0
    for file in files:
        if(Find(file, reg)):
            print(file)
            cnt=cnt+1
    if cnt>0:
        print('Find '+str(cnt)+' Results!')
    else:
        print('Failed Find Any Thing!!!')
    



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM