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

rufidmx · · 5400 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

首先:修改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

欢迎大家随便修改。


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:rufidmx

查看原文:统计代码行数工具 用golang实现

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5400 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传