在大量文件中搜索信息,并统一到一个文件中
问题描述:
给定一个文件夹,文件夹中包含有很多的子文件夹,子文件夹中有多个不同的文件,在这些文件中找到指定的信息,并把这些信息收集起来放入新生成的文件中,以方便查询。
这里所用的例子是,考生考试时产生的答案的文件夹,每个考生做不同的几道题,不同考生可以做相同的题,每道题生成一个文件,共有上万个文件,从这些文件中提取出所有考生的某道题的答案,例如高斯日记的答案,放入到一个新生成的文件中,要求,相同的答案只放一个即可。
解题思路:
先用 new File("考试_源程序")找到所要查询的文件夹(考试_源程序)的位置并打开,指用new PrintWriter("MyTest.txt")定位置创建一个新的文件(MyTest.txt)。然后一层一层打开该文件夹,这里提供的文件夹共有四层。打开之后,在每一个.txt文件中找到“高斯日记”这个关键词,在这个含有“高斯日记”的文件夹中的最后一行就是该同学所做的题的答案,把它记录下来,为了使答案不重复,这里先把答案加入到了Set里。然后再把Set里的东西一句一句写到MyTest.txt中。
//2017-03-22 by 迷糊狐狸
import java.io.File;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class MyWork {
//一层一层打开文件夹
static void f(File a, PrintWriter pw) throws Exception{
//准备一个Set放所需要的信息
Set<String> set = new HashSet<String>();
File[] f = a.listFiles();
for(File it: f){
File[] ff = it.listFiles();
for(File it2: ff){
File[] fff = it2.listFiles();
for(File it3: fff){
//把所有的".txt"文件打开看看
if(it3.getName().indexOf(".txt")>=0) worker(it3,set,pw);
}
}
}
worker2(set,pw);
}
//把传进来的".txt"文件查一下,看看里边是否有高斯日记这道题
static void worker(File f,Set set, PrintWriter pw) throws Exception{
Scanner scan = new Scanner(f,"utf-8");
try{
while(scan.hasNext()){
String s = scan.nextLine();
if(s.contains("Problem = 高斯日记")){
//找到了之后就把答案放入到之前准备的Set里
//找不到就换下一个文件
while(scan.hasNext()){
s = scan.nextLine();
if(s.trim().length()<=0)continue;
if(s.contains("//")) continue;
s = s.trim();
set.add(s);
}
}
}
}finally{
//看完之后要把文件关闭
scan.close();
}
}
//把Set里的元素全部写入到之前生成的文件中
static void worker2(Set<String> set, PrintWriter pw) throws Exception{
for(String s: set){
pw.write(s);
pw.println();
}
}
public static void main(String[] args) throws Exception{
//找到所需文件
File a = new File("D:\\新建文件夹\\学生答卷\\考试__源程序");
//指定位置生成一个文件
PrintWriter pw = new PrintWriter("D:\\新建文件夹\\正式"
+ "\\作业\\2017年3月\\2017-03-22\\MyTest.txt");
//开始工作
f(a,pw);
pw.flush();
}
}
最后生成的文件以及文件内容: