统计代码行数工具 用golang实现

首先:修改conf文件,配置要查找什么后缀的文件代码行数

使用方法:countcodeliine filename or nothing(计算可执行程序所在目录)


实现功能:

1,统计代码行数

2,可以根据配置文件(conf)来进行设置要对什么类型的代码进行统计

3,统计每个类型文件行数,和总行数


将来要实现功能:

1,注释行数

2,注释率

3,导出csv功能


源代码:

package main

import(
	"os"
	"container/list"
	"io"
	"log"
	"path/filepath"
	"bufio"
)

func init(){
	log.SetFlags(log.Llongfile| log.LstdFlags)
}

func main(){
	conf,err := ParseConf()
	if nil != err{
		log.Println(err)
		return
	}
	allFiles := GetAllFilesName()
	srcList := GetParsedFilesByConf(allFiles, conf)
	res := Parse(srcList)
	total := 0
	for k,v := range res{
		total += v
		println(k,":",v)
	}
	println("Total: ", total)
}

//example:map["go" or "css"]123
func Parse(files list.List)(parseResult map[string]int){
	parseResult = map[string]int{}
	for e := files.Front(); nil != e; e = e.Next(){
		v := e.Value.(string)
		ext := filepath.Ext(v)
		parseResult[ext] += ComputeLine(v)
	}
	return
}

func ComputeLine(path string)(num int){
	f,err := os.Open(path)
	if nil != err{
		log.Println(err)
		return
	}
	defer f.Close()

	r := bufio.NewReader(f)
	for{
		_,err := r.ReadString('\n')
		if io.EOF == err || nil != err{
			break
		}
		num += 1
	}
	return
}

func ParseConf()(conf []string, err error){
	confPath,_ := os.Getwd()
	confPath +=  "/conf"
	file,err := os.Open(confPath)
	if nil != err{
		log.Println(err)
		return
	}
	defer file.Close()
		scanner := bufio.NewScanner(file)
	for scanner.Scan(){
		conf = append(conf, scanner.Text())
	}
	//log.Println(conf)
	return
}

func GetSrcFullPath()(fullPath string){
	args := os.Args;
	parameterLen := len(args)
	if parameterLen == 1{
		fullPath,_ = os.Getwd()
	}else if(parameterLen >= 2){
		fullPath = args[1]
	}

	fullPath,_ = filepath.Abs(fullPath)
	return
}

func GetParsedFilesByConf(lst list.List,conf []string)(l list.List){
	for e := lst.Front(); nil != e; e = e.Next(){
		ext := filepath.Ext(e.Value.(string))
		for _,extension := range conf{
			if ext == extension{
				l.PushBack(e.Value.(string))
				continue
			}
		}
	}

	for e := l.Front(); nil != e; e = e.Next(){
		println("matched string:" ,e.Value.(string))
	}
	return
}

func GetAllFilesName() (lst list.List){
	fullPath := GetSrcFullPath()
	filepath.Walk(fullPath,func(path string,fi os.FileInfo,err error)error{
		if nil == fi {
			return err
		}
		if fi.IsDir() {
			return nil
		}

		//println(fi.Name())
		//println(path)
		//name := fi.Name()
		lst.PushBack(path)
		return nil
	})
	return
}

rd := bufio.NewReader(file)
	var line string
	for{
		line, err = rd.ReadString('\n')
		if io.EOF == err{
			err = nil
			break
		}else if nil != err{
			break
		}
		conf = append(conf, line[:len(line)-1])
	}
ReadString('\n')只能在linux上可以运行,因为windwos换行符是\r\n,linux是\n,所以换成用Scan来实现,但是Scan是go1.1

新增的struct,大家使用时请务必注意升级go。

conf配置文件:

.go
.html
.css
.js

github地址:

https://github.com/zoro-du/countcodeline

欢迎大家随便修改。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值