分享
统计代码行数工具 用golang实现
rufidmx · · 6167 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
首先:修改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
欢迎大家随便修改。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信6167 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
首先:修改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
欢迎大家随便修改。