txtreader.go 1.1 KB

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