使用方法:countcodeliine filename or nothing(计算可执行程序所在目录)
实现功能:
2,可以根据配置文件(conf)来进行设置要对什么类型的代码进行统计
将来要实现功能:
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
欢迎大家随便修改。