文档内容查找器【安利一个自己搞的黑科技】
某日 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!!!')