Wordcount

 

一:

 

合作者:    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的理解流于表面,实践 能力较弱,导致事倍功半,但对项目开发流程有了深刻认识,为以后的学习提供了帮助。

 

posted on 2018-10-21 19:52  Yangganghong  阅读(116)  评论(0编辑  收藏  举报

导航