txtreader.go 1000 B

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