WordCount

Posted on 2018-10-21 19:52  C_R_ZzJ  阅读(158)  评论(0编辑  收藏  举报

---恢复内容开始---

 

合作者:    201631062631 ;  201631062431      

代码地址:https://gitee.com/ZzGgJj/WordCountT

本次作业的链接地址:https://edu.cnblogs.com/campus/xnsy/Test/homework/2203

2.1.1 基本功能

wc.exe -c file.c     //返回文件 file.c 的字符数

wc.exe -w file.c     //返回文件 file.c 的单词总数

wc.exe -l file.c     //返回文件 file.c 的总行数

wc.exe -o outputFile.txt     //将结果输出到指定文件outputFile.txt

 

2.1.2 扩展功能(未完成)

wc.exe -s            //递归处理目录下符合条件的文件

wc.exe -a file.c     //返回更复杂的数据(代码行 / 空行 / 注释行)

wc.exe -e stopList.txt  // 停用词表,统计文件单词总数时,不统计该表中的单词

[file_name]: 文件或目录名,可以处理一般通配符。

代码

主函数

package workCount;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.MalformedInputException;
import java.util.ArrayList;
import java.util.List;

import org.omg.CORBA.PUBLIC_MEMBER;

public class cMain {
	static String filepath="G:/eclipse/workCount/result.txt";//设置初始的文件输出路径,有-o命令就对其更改
	static String stopfile=null;//停词表
	static List<String> comonds=new ArrayList<>();//创建list存储命令,即-c,-o等选项
	static List<String> filenames=new ArrayList<>();//创建list存储文件的路径
	public static void main(String[] args) throws IOException
	{
		for(int i=0;i<args.length;i++)//遍历args,将命令和文件路径分开
		{
			if(args[i].startsWith("-")){
				comonds.add(args[i]);//添加命令
			}
			else{
				filenames.add(args[i]);//添加文件的路径
			}
		}
		String result="";//存储每一次返回的结果
		for(int i=0;i<comonds.size();i++)
		{
			/*if(comonds.contains("-x"))
			{
				wcUI wUi=new wcUI();
			}*/
			if(!comonds.contains("-o")&&comonds.contains("-e"))//判断命令中是否含有-o和-e的命令
				// 默认若有-o则需要放在岁后面,若有-e,则-e需要在-o前面
			{
				for(int j=0;j<(filenames.size()-1);j++){
				System.out.println("1");
				stopfile=filenames.get(filenames.size()-1);
				result+="\n"+selectCommand(comonds.get(i),filenames.get(j));
				}
				output(result);//将结果输出至文件
			}else if(comonds.contains("-o")&&comonds.contains("-e")){//有-o的命令,则最后一个文件路径则是想要输出的文件路径
				filepath=filenames.get(filenames.size()-1);//对输出文件的路径进行更改
				stopfile=filenames.get(filenames.size()-2);//修改停词表路径
				for(int j=0;j<(filenames.size()-2);j++){
				result+="\n"+selectCommand(comonds.get(i),filenames.get(j));
				}
				output(result);//将结果输出至文件
			}else if(comonds.contains("-o")&&!comonds.contains("-e")){
				filepath=filenames.get(filenames.size()-1);//对输出文件的路径进行更改
				System.out.println(filepath);
				for(int j=0;j<(filenames.size()-1);j++){
				result+="\n"+selectCommand(comonds.get(i),filenames.get(j));
				}
				output(result);//将结果输出至文件
			}else {
				for(int j=0;j<filenames.size();j++){
				result+="\n"+selectCommand(comonds.get(i),filenames.get(j));
				}
				output(result);//输出结果至文件
			}
		}
	}
	static public String selectCommand(String command,String filename) throws IOException
	//选择命令,并执行
	{ 
		String result ="";
		workCount wCount=new workCount();
		// 实例化workCount
			switch (command) {//判断命令并执行
			case "-c":
				result=wCount.count_char(filename);
				break;
			case "-l":
				result=wCount.count_line(filename);
				break;
			case "-w":
				result=wCount.count_word(filename);
				break;
			case "-a":
				result=wCount.count_moreLine(filename);
				break;
			case "-s":
				result=wCount.recursiveFindFile(filename);
				break;
			case "-e":
				result="使用停词表后单词数为:"+wCount.stopWordList(filename,stopfile);
				break;
			case "-o":
			    break;
			default:
				System.out.println("有命令错误");
				break;
			}
		return result;//返回结果
	}
	public static void output(String result) throws IOException{//将结果写入文件
		File file=new File(filepath);//定义文件
		if(!file.exists()){//判断文件是否存在,不存在则直接创建新文件
			file.createNewFile();
		}
		FileWriter fileWriter=new FileWriter(file);
		BufferedWriter bWriter=new BufferedWriter(fileWriter);//放入缓冲层
		bWriter.write(result);//写入数据
		bWriter.close();//关闭流
	}
}

  统计单词数

	public String count_word(String filename) throws IOException{//统计单词数
		//int wordnum=0;//单词数
		File file =new File(filename);
		int x=-1;
		FileReader fReader=new FileReader(file);
		while((x=fReader.read())!=-1){//按字符读文件,碰到符合条件的,单词数+1
			char a=(char)x;
			if(a==' '||a==','||a=='.'){
				wordnum++;
			}
		}
		String result=filename+",单词数:"+wordnum;//保存结果
		fReader.close();//关闭流
		return result;//返回结果
	}

  统计字符数

public String count_char(String filename) throws IOException{//统计字符数
		int charnum=0;//字符数
		File file=new File(filename);
		int x=-1;
		FileReader fReader=new FileReader(file);
		while((x=fReader.read())!=-1){//按字符读文件,判断,符合则字符加一
			char a=(char)x;
			if(a!='\n'&&a!='\r'){
				charnum++;
			}
		}
		String result=filename+",字符数:"+charnum;//保存结果
		fReader.close();//关闭流
		return result;//返回结果
	}

  统计行数

public String count_line(String filename) throws IOException{//统计行数
		int line=0;//行数
		File file=new File(filename); 
		BufferedReader bReader;//缓冲区
		bReader=new BufferedReader(new FileReader(file));
			while(bReader.readLine()!=null){//对文件进行以行为单位读取,不为空则行数加一
				line++;
			}
			bReader.close();//关闭流
		String result=filename+",总行数:"+line;//保存结果
		return result;//返回结果
	}

  查询代码行 / 空行 / 注释行)

	public String count_moreLine(String filename) throws IOException// 返回各种行数
	{
		int noteLine=0;
		// 注释行
		int emptyLine=0;
		// 空行
		int codeLine=0;
		// 代码行
		int sumLine=0;
		int tag=0;
		// 设置标记,记录多行注释时的注释代码行数
		File file=new File(filename);
		BufferedReader bReader=new BufferedReader(new FileReader(file));
		String s;
		while((s=bReader.readLine())!=null){
			sumLine++;
			if(s.isEmpty()||s.startsWith("{")&&s.endsWith("{")||s.startsWith("}")&&s.endsWith("}")){
				// 对空行的判断
				emptyLine++;
			}
			if(tag==0){
				if(s.contains("//")){
					// 判断注释符
					noteLine++;
				}else if(s.contains("/*")){
					noteLine++;
					tag=1;
				}
				
			}else {
				noteLine++;
				if(s.contains("*/")){
					//判断下一行是否有下一个注释符
				 tag=0;
				}
			}
		}
		bReader.close();
		codeLine=sumLine-emptyLine-noteLine;
		String result=filename+",注释行:"+noteLine+",空行数:"+emptyLine+",代码行:"+codeLine;
		return result;
	}

  递归处理目录下符合条件的文件

public String recursiveFindFile(String filepath) throws IOException//递归
	{
	
		String result=null;
		File file=new File(filepath);
		if(file.isDirectory()){
			File[] files=file.listFiles();
			if(files.length==0)
			{
				System.out.println("空目录");
			}else{
				for(File f : files)
				{
					if(f.isDirectory())
						// 判断是否为目录
					{
						recursiveFindFile(f.getPath());
					}else if(f.isFile()) {
						// 判断是否为文件
						 		result+="\n文件名:"+f.getPath()+"\n"+count_word(f.getPath())+
								"\n"+count_line(f.getPath())+
								"\n"+count_char(f.getPath())+
								"\n"+count_moreLine(f.getPath());
					}
				}
			}
		}else if(file.isFile()){
			// 判断是否直接就为文件
			result="文件名:"+filepath+"\n"+count_word(filepath)+
					"\n"+count_line(filepath)+
					"\n"+count_char(filepath)+
					"\n"+count_moreLine(filepath);
		}
		return result;
	}

  测试

 

 

 

 

 

 

 

 

 总结

本次项目采用了Java,实现了Wordcount的基本功能,但在一些非法操作符输入时,并不能正确处理。在需求分析以及结构设计方面仍存在较大问题,不清晰,不明确,严重影响项目开发的进度,同时编程能力不足也是一个因素,思路不清晰,对Java的理解流于表面,实践 能力较弱,导致事倍功半,但对项目开发流程有了深刻认识,为以后的学习提供了帮助。

---恢复内容结束---

Copyright © 2024 C_R_ZzJ
Powered by .NET 9.0 on Kubernetes