WordCount

李成洪發表於2018-09-23

李成洪的github

一..需求說明

1.基本需求

   輸入:txt檔案

   輸出:將txt檔案中的字元數、單詞數、行數,統計結果以指定格式輸出到預設檔案

2.輸入輸出以及計算規定

      wc.exe -c file.c         返回檔案 file.c 的字元數wc.exe -w file.c

      wc.exe -w file.c        返回檔案 file.c 的單詞總數

      wc.exe -l file.c         返回檔案 file.c 的總行數

      wc.exe -o outputFile.txt     //將結果輸出到指定檔案outputFile.txt

     空格,水平製表符,換行符,均算字元。

     由空格或逗號分割開的都視為單詞,且不做單詞的有效性校驗,例如:thi#,that視為用逗號隔開的2個單詞。

     -c, -w, -l引數可以共用同一個輸入檔案,形如:wc.exe –w –c file.c 。

     -o 必須與檔名同時使用,且輸出檔案必須緊跟在-o引數後面,不允許單獨使用-o引數。 

3.PSP

PSP2.1

PSP階段

預估耗時

(分鐘)

實際耗時

(分鐘)

Planning

計劃

400

 

· Estimate

· 估計這個任務需要多少時間

350

 

Development

開發

50

 60

· Analysis

· 需求分析 (包括學習新技術)

40

90

· Design Spec

· 生成設計文件

 30

 60

· Design Review

· 設計複審 (和同事稽核設計文件)

 30

 30

· Coding Standard

· 程式碼規範 (為目前的開發制定合適的規範)

 20

 30

· Design

· 具體設計

 30

40

· Coding

· 具體編碼

 60

120

· Code Review

· 程式碼複審

 30

 20

· Test

· 測試(自我測試,修改程式碼,提交修改)

 40

60

Reporting

報告

 20

80

· Test Report

· 測試報告

 20

 0

· Size Measurement

· 計算工作量

 370

 

· Postmortem & Process Improvement Plan

· 事後總結, 並提出過程改進計劃

 30

 

 

合計

 400

 590

4.思路

  通過java的輸入輸出流讀寫檔案,遍歷檔案中的每一個字元判斷其中的空格數,換行健,逗號,分好的數目來統計。

5.類

  1.Util 工具包類提供檔案的讀寫

   2.WordCount類 判斷檔案中的字元數,行數,單詞數

   3.CountPrintl類 將結果列印到指定的檔案中

   4.Test類 單元測試類

   5.Client 客戶端 

5.關鍵程式碼

  

package Util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
public class WDUtil {
    //工具類      負責讀寫工具
    
    /*讀取檔案
     * FilePath 檔案的路徑
     * 返回 StringBuffer
     */
    public String fielRead(String FilePath) 
    {
        File file=new File(FilePath);
        StringBuffer sb=new StringBuffer();
        try {
            FileInputStream fis=new FileInputStream(file);
            InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
            
            while(reader.ready())
            {
                sb.append((char)reader.read());
            }
            reader.close();
            fis.close();
        } catch (Exception  e) {
            
            e.printStackTrace();
        }
        return sb.toString();
    }
    
    /*
     * FilePath 儲存檔案的路徑
     * txt 儲存的內容
     */
    public void fileWrite(String FilePath,String txt)
    {
        File file=new File(FilePath);
        try {
            FileOutputStream fop=new FileOutputStream(file);
            OutputStreamWriter writer =new OutputStreamWriter(fop, "utf-8");
            writer.write(txt);
            writer.close();
            fop.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

}

 

package CountWord;

import Util.WDUtil;

public class CountWord {

    WDUtil util = new WDUtil();// 讀寫檔案的工具物件

    /*
     * path 檔案的路徑 返回檔案的總字數
     */
    public int countChar(String path) {
        int charNum = 0;

        String words = util.fielRead(path);
        charNum = words.length();
        return charNum;
    }

    /*
     * path 檔案的位置 返回檔案中空格的數目
     */

    public int countWord(String path) {
        int wordNum = 0;
        String words = util.fielRead(path);
        for (int i = 0; i < words.length() - 1; i++)// 最後一個字母特殊考慮
        {
            if (words.charAt(i) == ' ' || words.charAt(i) == ';' || words.charAt(i) == ',' || words.charAt(i) == '.')// 出現空格逗號句號分號都算一個單詞
            {
                wordNum++;
            }
        }
        wordNum++;// 最後一個不管是什麼字母結尾,單詞數都加1

        return wordNum;
    }

    public int countEnter(String path) {
        int wordNum = 0;
        String words = util.fielRead(path);
        for (int i = 0; i < words.length(); i++) {
            if (words.charAt(i) == '\n') {
                wordNum++;
            }
        }
        return wordNum + 1;
    }
}
package CountWord;

import java.util.Scanner;

import Util.WDUtil;

/*
 * 根據輸入的命令獲取操作,和檔案路徑最後計算結果儲存到路徑中
 */
public class PrintfCount {

    CountWord cWord=new CountWord();
    WDUtil wdUtil=new WDUtil();
    int charNum=0;//字元的數目
    int wordNum=0;//單詞的
    int enterNum=0;//行數

    
    
    public void Print(String[] args)
    {
       String txt=null;
       String path=args[args.length-1];
       for(int i=0;i<args.length;i++)
       {
           String operation=args[i];
           switch(operation)
           {
                   case "-c":
                   //計算字元數
                   {
                       charNum=cWord.countChar(path);
                       System.out.println("字元數為:"+charNum);
                       break;
                   }
       
       
                   case "-w":
                       //計算單詞數
                   {
                       wordNum=cWord.countWord(path);
                       System.out.println("單詞數為:"+wordNum);
                       break;
                   }
               
                   case "-l":
                       //計算行數
                   {
                       enterNum=cWord.countEnter(path);
                       System.out.println("行數為:"+enterNum);
                       break;
                   }
               
                   case "-o":
                   {
                       String result=wdUtil.fielRead("result.txt");
                       wdUtil.fileWrite(args[i+1],result);
                       break;
                   }
                   
               }
               
       }
       txt="字元的個數為"+charNum+"\n單詞的個數為"+wordNum+"\n行數為"+enterNum;
       wdUtil.fileWrite("result.txt", txt);
       
    }
    

}

 

測試總結:1.我不知道table在計算的時候是算一個字元還是多少個,我電腦上算的3個

                  2.在計算單詞時我覺得以分號,逗號,句號,空格結尾都應該算一個單詞

                  3.在文章結尾應當預設增加一個單詞

7.相關連結

   有關部落格的使用和排版,:http://www.cnblogs.com/math/p/se-tools-001.html。 

    有關Git的使用,廖雪峰的官方網站。      

8.最後

   非常感謝老師給我們的引導,我一直知道git很神奇也很好用。但是迫於害怕和沒有機會,一直沒有實踐過,謝謝老師給我的資料和實踐的機會。本次部落格寫的有點匆忙,有不足之處請多多指教。