diff --git a/file_util.go b/file_util.go new file mode 100644 index 0000000..7fd66bf --- /dev/null +++ b/file_util.go @@ -0,0 +1,52 @@ +package chart + +import ( + "bufio" + "io" + "os" + + exception "github.com/blendlabs/go-exception" +) + +var ( + // File contains file utility functions + File = fileUtil{} +) + +type fileUtil struct{} + +// ReadByLines reads a file and calls the handler for each line. +func (fu fileUtil) ReadByLines(filePath string, handler func(line string)) error { + if f, err := os.Open(filePath); err == nil { + defer f.Close() + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + line := scanner.Text() + handler(line) + } + } else { + return exception.Wrap(err) + } + return nil +} + +// ReadByChunks reads a file in `chunkSize` pieces, dispatched to the handler. +func (fu fileUtil) ReadByChunks(filePath string, chunkSize int, handler func(line []byte)) error { + if f, err := os.Open(filePath); err == nil { + defer f.Close() + + chunk := make([]byte, chunkSize) + for { + readBytes, err := f.Read(chunk) + if err == io.EOF { + break + } + readData := chunk[:readBytes] + handler(readData) + } + } else { + return exception.Wrap(err) + } + return nil +}