Golang如何通过设置分隔符重组文本文件数据
Golang如何通过设置分隔符重组文本文件数据
我正在尝试通过定义分隔符来重新组织.txt文件中的数据。数据示例如下:
password 0.0.3 13.99.102.201:5021133.20.130.214:50212
我试图根据空白字符和:符号后的五个字节来分割这些数据,以便将其保存到不同的变量中。具体如下所示。
key = password
node = 0.0.3
address1 = 13.99.102.201
tls1 = 50211
address2 = 33.20.130.214
tls2 = 50212
代码:
content, err := ioutil.ReadFile(title)
if err != nil {
fmt.Println("Err")
}
data := strings.Split(string(content), ":")
然而,strings.Split(string, ":")实际上会删除分隔符,而不是将其作为裁剪文本的起点。
更多关于Golang如何通过设置分隔符重组文本文件数据的实战教程也可以访问 https://www.itying.com/category-94-b0.html
4 回复
这完全符合我的需求
可以使用 strings.FieldsFunc 结合自定义分割逻辑,或通过正则表达式实现。以下是两种示例方法:
方法一:使用 strings.FieldsFunc
package main
import (
"fmt"
"strings"
"unicode"
)
func main() {
text := "password 0.0.3 13.99.102.201:5021133.20.130.214:50212"
// 自定义分割函数:按空白字符和':'后的5个字节分割
splitFunc := func(r rune) bool {
return unicode.IsSpace(r) || r == ':'
}
fields := strings.FieldsFunc(text, splitFunc)
// 提取字段
key := fields[0]
node := fields[1]
address1 := fields[2]
tls1 := fields[3][:5] // 取前5个字符
address2 := fields[3][5:] // 取剩余字符
tls2 := fields[4]
fmt.Printf("key = %s\n", key)
fmt.Printf("node = %s\n", node)
fmt.Printf("address1 = %s\n", address1)
fmt.Printf("tls1 = %s\n", tls1)
fmt.Printf("address2 = %s\n", address2)
fmt.Printf("tls2 = %s\n", tls2)
}
方法二:使用正则表达式
package main
import (
"fmt"
"regexp"
)
func main() {
text := "password 0.0.3 13.99.102.201:5021133.20.130.214:50212"
// 正则匹配模式
re := regexp.MustCompile(`(\S+)\s+(\S+)\s+(\d+\.\d+\.\d+\.\d+):(\d{5})(\d+\.\d+\.\d+\.\d+):(\d{5})`)
matches := re.FindStringSubmatch(text)
if matches != nil {
fmt.Printf("key = %s\n", matches[1])
fmt.Printf("node = %s\n", matches[2])
fmt.Printf("address1 = %s\n", matches[3])
fmt.Printf("tls1 = %s\n", matches[4])
fmt.Printf("address2 = %s\n", matches[5])
fmt.Printf("tls2 = %s\n", matches[6])
}
}
文件读取版本
package main
import (
"fmt"
"io/ioutil"
"strings"
"unicode"
)
func main() {
content, err := ioutil.ReadFile("data.txt")
if err != nil {
panic(err)
}
text := strings.TrimSpace(string(content))
splitFunc := func(r rune) bool {
return unicode.IsSpace(r) || r == ':'
}
fields := strings.FieldsFunc(text, splitFunc)
if len(fields) >= 5 {
key := fields[0]
node := fields[1]
address1 := fields[2]
tls1 := fields[3][:5]
address2 := fields[3][5:]
tls2 := fields[4]
fmt.Printf("key = %s\n", key)
fmt.Printf("node = %s\n", node)
fmt.Printf("address1 = %s\n", address1)
fmt.Printf("tls1 = %s\n", tls1)
fmt.Printf("address2 = %s\n", address2)
fmt.Printf("tls2 = %s\n", tls2)
}
}
第一个方法通过自定义分割函数处理空白字符和冒号,然后手动分割第五个字段。第二个方法使用正则表达式精确匹配IP地址和端口模式。文件读取版本展示了如何从文本文件读取并处理数据。


