csvreader.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package reader
  2. import (
  3. "fmt"
  4. "io"
  5. "strings"
  6. "git.wecise.com/wecise/util/merrs"
  7. )
  8. type CSVBlockReader struct {
  9. *LineReader
  10. csvkeys []string
  11. }
  12. func NewCSVBlockReader(filename string, reader io.Reader) *CSVBlockReader {
  13. return &CSVBlockReader{
  14. LineReader: NewLineReader(filename, reader),
  15. }
  16. }
  17. func (br *CSVBlockReader) ReadBlock() (block map[string]any, linecount int, err error) {
  18. var line string
  19. eof := false
  20. for {
  21. line, linecount, eof, err = br.ReadLine()
  22. if err != nil {
  23. return
  24. }
  25. if linecount == 1 {
  26. br.csvkeys = strings.Split(line, "^")
  27. line, linecount, eof, err = br.ReadLine()
  28. if err != nil {
  29. return
  30. }
  31. }
  32. if line == "" {
  33. if eof {
  34. return
  35. }
  36. continue
  37. }
  38. values := strings.Split(line, "^")
  39. if len(values) != len(br.csvkeys) {
  40. err = merrs.NewError(fmt.Sprint(br.filename, " format error, values count not match keys count, line ", br.linecount))
  41. return
  42. }
  43. block = map[string]any{}
  44. for i, k := range br.csvkeys {
  45. block[k] = values[i]
  46. }
  47. return
  48. }
  49. }