io_test.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package test
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "os"
  7. "regexp"
  8. "strings"
  9. "testing"
  10. )
  11. func TestIO(t *testing.T) {
  12. //file, err := os.OpenFile("b.txt", os.O_RDONLY, 0)
  13. file, err := os.OpenFile("b.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0)
  14. if err != nil {
  15. panic(err)
  16. }
  17. defer file.Close()
  18. contentBytes, err := io.ReadAll(file)
  19. fmt.Println(string(contentBytes))
  20. }
  21. func TestPrint1(t *testing.T) {
  22. // 打开文件[1,3](@ref)
  23. file, err := os.Open("C:\\Users\\mlxengingin\\GolandProjects\\cicv_data_closed_loop0326\\aarch64\\pjibot_clean\\master\\package\\config\\清洁机器人话题列表.txt")
  24. if err != nil {
  25. fmt.Printf("Error opening file: %v\n", err)
  26. return
  27. }
  28. defer file.Close()
  29. // 创建扫描器逐行读取[1,3,8](@ref)
  30. scanner := bufio.NewScanner(file)
  31. lineNumber := 1
  32. // 处理每一行内容
  33. for scanner.Scan() {
  34. line := scanner.Text()
  35. // 格式化输出为 TopicN = "行内容"[1,8](@ref)
  36. fmt.Printf("\tTopic%-3d = \"%s\"\n", lineNumber, line)
  37. lineNumber++
  38. }
  39. // 检查扫描错误[1,3](@ref)
  40. if err := scanner.Err(); err != nil {
  41. fmt.Printf("Error reading file: %v\n", err)
  42. }
  43. }
  44. func TestPrint2(t *testing.T) {
  45. // 使用固定宽度左对齐格式控制规则编号排版[6,7](@ref)
  46. const (
  47. ruleWidth = 10 // 规则编号部分占10字符宽度
  48. totalRules = 284 // 总生成规则数
  49. ruleNameFmt = "Rule%d"
  50. )
  51. // 通过for循环生成指定数量的规则行[3,4](@ref)
  52. for i := 1; i <= totalRules; i++ {
  53. // 使用Sprintf构建规则前缀[6](@ref)
  54. rulePrefix := fmt.Sprintf(ruleNameFmt, i)
  55. // 采用%-*s实现动态宽度对齐,确保后续内容垂直对齐[7](@ref)
  56. fmt.Printf("%-*s []func(data *sensor_msgs.Imu) string\n", ruleWidth, rulePrefix)
  57. }
  58. }
  59. func TestPrint3(t *testing.T) {
  60. // 文件路径配置(根据实际位置修改)
  61. const filePath = "C:\\Users\\mlxengingin\\GolandProjects\\cicv_data_closed_loop0326\\aarch64\\pjibot_clean\\master\\package\\config\\机器人话题和数据类型对应关系.txt"
  62. // 使用高效方式读取文件(网页1、网页3推荐方法)
  63. file, err := os.Open(filePath)
  64. if err != nil {
  65. fmt.Printf("文件打开失败: %v\n", err)
  66. return
  67. }
  68. defer file.Close()
  69. // 初始化规则生成器
  70. var rules []string
  71. ruleCounter := 1
  72. // 逐行处理文件内容(网页2、网页4推荐方法)
  73. scanner := bufio.NewScanner(file)
  74. for scanner.Scan() {
  75. line := strings.TrimSpace(scanner.Text())
  76. if line == "" {
  77. continue // 跳过空行
  78. }
  79. // 分割字段(网页7推荐方法)
  80. fields := strings.Fields(line)
  81. if len(fields) < 2 {
  82. continue // 跳过格式错误行
  83. }
  84. // 转换消息类型格式(网页8字符串处理)
  85. msgType := strings.Replace(fields[1], "/", ".", -1)
  86. // 生成规则定义(网页6格式化最佳实践)
  87. rule := fmt.Sprintf("Rule%-2d []func(data *%s) string", ruleCounter, msgType)
  88. rules = append(rules, rule)
  89. ruleCounter++
  90. }
  91. // 错误检查(网页3建议)
  92. if err := scanner.Err(); err != nil {
  93. fmt.Printf("文件读取错误: %v\n", err)
  94. return
  95. }
  96. // 格式化输出结果(网页5、网页8的字符串构建建议)
  97. fmt.Println("生成规则结构体:")
  98. fmt.Println("type Rules struct {")
  99. for _, rule := range rules {
  100. fmt.Printf("\t%s\n", rule)
  101. }
  102. fmt.Println("}")
  103. }
  104. func TestPrint4(t *testing.T) {
  105. rules := parseRules("C:\\Users\\mlxengingin\\GolandProjects\\cicv_data_closed_loop0326\\aarch64\\pjibot_clean\\master\\package\\config\\rules.txt")
  106. generateCode(rules)
  107. }
  108. // 定义规则解析结构体
  109. type RuleMeta struct {
  110. RuleName string
  111. MessageType string
  112. }
  113. func parseRules(filename string) []RuleMeta {
  114. file, _ := os.Open(filename)
  115. defer file.Close()
  116. scanner := bufio.NewScanner(file)
  117. var rules []RuleMeta
  118. pattern := regexp.MustCompile(`(\w+)\s+$$$$func$data\s+\*([\w\.]+)$`)
  119. for scanner.Scan() {
  120. line := strings.TrimSpace(scanner.Text())
  121. if matches := pattern.FindStringSubmatch(line); len(matches) == 3 {
  122. rules = append(rules, RuleMeta{
  123. RuleName: matches[1],
  124. MessageType: matches[2],
  125. })
  126. }
  127. }
  128. return rules
  129. }
  130. func generateCode(rules []RuleMeta) {
  131. var builder strings.Builder
  132. builder.WriteString("switch topic2 {\n")
  133. for i, rule := range rules {
  134. // 生成条件分支
  135. builder.WriteString(fmt.Sprintf("\tcase Topic%d: // %d\n", i+1, i+1))
  136. builder.WriteString(fmt.Sprintf("\t\tif f, ok1 := rule.(func(*%s) string); ok1 {\n", rule.MessageType))
  137. builder.WriteString(fmt.Sprintf("\t\t\t%s = append(%s, f)\n", rule.RuleName, rule.RuleName))
  138. builder.WriteString("\t\t\tgoto JudgeDone\n")
  139. builder.WriteString("\t\t}\n")
  140. builder.WriteString("\t\tlog(triggerLocalPath)\n")
  141. builder.WriteString("\t\tcontinue\n\n")
  142. }
  143. builder.WriteString("\tdefault:\n\t\t// 默认处理逻辑\n")
  144. builder.WriteString("}")
  145. fmt.Println(builder.String())
  146. }