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  }