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 回复

非常感谢。

更多关于Golang如何通过设置分隔符重组文本文件数据的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这完全符合我的需求

你好,我刚开始使用空格作为分隔符来获取键和节点。然后使用另一个标记作为第二遍的输入,接着使用“:”作为分隔符。 请查看以下示例(记得添加错误处理 🙂):

Go Playground - The Go Programming Language

func main() {
    fmt.Println("hello world")
}

可以使用 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地址和端口模式。文件读取版本展示了如何从文本文件读取并处理数据。

回到顶部