csvreader.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package reader
  2. import (
  3. "fmt"
  4. "io"
  5. "strconv"
  6. "strings"
  7. "git.wecise.com/wecise/util/merrs"
  8. "github.com/spf13/cast"
  9. )
  10. type CSVBlockReader struct {
  11. *LineReader
  12. csvkeys []string
  13. }
  14. func NewCSVBlockReader(filename string, reader io.Reader) *CSVBlockReader {
  15. return &CSVBlockReader{
  16. LineReader: NewLineReader(filename, reader),
  17. }
  18. }
  19. func (br *CSVBlockReader) ReadBlock() (block map[string]any, linecount int, err error) {
  20. var line string
  21. eof := false
  22. for {
  23. line, linecount, eof, err = br.ReadLine()
  24. if err != nil {
  25. return
  26. }
  27. if linecount == 1 {
  28. br.csvkeys = strings.Split(line, "^")
  29. line, linecount, eof, err = br.ReadLine()
  30. if err != nil {
  31. return
  32. }
  33. }
  34. if line == "" {
  35. if eof {
  36. return
  37. }
  38. continue
  39. }
  40. values := strings.Split(line, "^")
  41. if len(values) != len(br.csvkeys) {
  42. err = merrs.NewError(fmt.Sprint(br.filename, " format error, values count not match keys count, line ", br.linecount))
  43. return
  44. }
  45. block = map[string]any{}
  46. for i, k := range br.csvkeys {
  47. v := values[i]
  48. if v != "" {
  49. n := cast.ToInt(v)
  50. if n != 0 || v == "0" {
  51. block[k] = n
  52. continue
  53. }
  54. f := cast.ToFloat64(v)
  55. if f != 0 || v == "0" || v == "0.0" || v == ".0" || v == "0." {
  56. block[k] = f
  57. continue
  58. }
  59. b := cast.ToBool(v)
  60. if v == "true" || v == "false" {
  61. block[k] = b
  62. continue
  63. }
  64. s, e := strconv.Unquote(v)
  65. if e == nil {
  66. block[k] = s
  67. continue
  68. }
  69. }
  70. block[k] = v
  71. }
  72. return
  73. }
  74. }