txtreader.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package reader
  2. import (
  3. "encoding/json"
  4. "io"
  5. "regexp"
  6. "git.wecise.com/wecise/cgimport/schema"
  7. )
  8. type TXTBlockReader struct {
  9. *LineReader
  10. filetype schema.FileType
  11. firstline string
  12. nextline string
  13. }
  14. func NewTXTBlockReader(filename string, filetype schema.FileType, reader io.Reader) *TXTBlockReader {
  15. return &TXTBlockReader{
  16. LineReader: NewLineReader(filename, reader),
  17. filetype: filetype,
  18. }
  19. }
  20. var regrecord = regexp.MustCompile(`^(?:[\.\/a-zA-Z0-9_]*:)?V:(\{.*)`)
  21. func (br *TXTBlockReader) ReadBlock() (block map[string]any, line string, linecount int, err error) {
  22. eof := false
  23. line = br.nextline
  24. for {
  25. for {
  26. br.nextline, linecount, eof, err = br.ReadLine()
  27. if err != nil {
  28. return
  29. }
  30. if br.nextline == "" && eof {
  31. if line == "" {
  32. return
  33. }
  34. break
  35. }
  36. if regrecord.MatchString(br.nextline) {
  37. break
  38. }
  39. line += br.nextline
  40. }
  41. linecount--
  42. if !regrecord.MatchString(line) {
  43. if linecount == 1 {
  44. br.firstline = line
  45. }
  46. line = br.nextline
  47. continue
  48. }
  49. line = regrecord.ReplaceAllString(line, "$1")
  50. block = map[string]any{}
  51. err = json.Unmarshal([]byte(line), &block)
  52. if err != nil {
  53. return
  54. }
  55. return
  56. }
  57. }