github.com/TrueBlocks/trueblocks-core/src/apps/chifra@v0.0.0-20241022031540-b362680128f7/pkg/file/wc.go (about) 1 package file 2 3 import ( 4 "bufio" 5 "bytes" 6 "io" 7 "os" 8 ) 9 10 func WordCount(fileName string, ignoreHeader bool) (int, error) { 11 // fmt.Println("-------------------------------------------") 12 // fmt.Println(fileName, FileExists(fileName)) 13 // fmt.Println("-------------------------------------------") 14 r, _ := os.OpenFile(fileName, os.O_RDONLY, 0) 15 defer r.Close() 16 17 var count int 18 const lineBreak = '\n' 19 20 buf := make([]byte, bufio.MaxScanTokenSize) 21 22 for { 23 bufferSize, err := r.Read(buf) 24 if err != nil && err != io.EOF { 25 return 0, err 26 } 27 28 var buffPosition int 29 for { 30 i := bytes.IndexByte(buf[buffPosition:], lineBreak) 31 if i == -1 || bufferSize == buffPosition { 32 break 33 } 34 buffPosition += i + 1 35 count++ 36 } 37 if err == io.EOF { 38 break 39 } 40 } 41 42 if ignoreHeader && count > 0 { 43 count-- 44 } 45 return count, nil 46 }