加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 19:00:23 所属栏目:大数据 来源:网络整理
导读:首先:修改conf文件,配置要查找什么后缀的文件代码行数 使用方法:countcodeliine filename or nothing(计算可执行程序所在目录) 实现功能: 1,统计代码行数 2,可以根据配置文件(conf)来进行设置要对什么类型的代码进行统计 3,统计每个类型文件行数,和

首先:修改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换行符是rn,linux是n,所以换成用Scan来实现,但是Scan是go1.1

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

conf配置文件:

.go
.html
.css
.js

github地址:

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

欢迎大家随便修改。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读