我正在尝试从特定格式的文件中读取数据。
文件如下所示
title:stack|content:overflow|metadata:53|comments:none
title:google|content:website|metadata:213|comments:Demos
我需要逐行阅读
为标题变量分配 title
值("stack"
),为内容分配 content
值("overflow"
)每行。
scanner := bufio.NewScanner(file)
for scanner.Scan() {
data := scanner.Text()
data_arr := strings.Split(data, "|")
for _, n := range data_arr {
data_subdoc := strings.Split(n, ":")
a, b := data_subdoc[0], data_subdoc[1]
fmt.Println(a, b)
但问题是我得到的数据是(标题、内容、元数据和每行注释之间的关系丢失)
title stack
content overflow
metadata 53
comments none
title google
content website
metadata 213
comments Demos
但是,我想要这样的东西:
stack overflow 53
if stack has 53:
print comments (in this case, its 'none')
google website 213
if google has 213, print content (In this case, its 'website')
最佳答案
正如@LutzHorn 所建议的那样,为什么不将您的数据读入结构?下面的代码使用反射来实现这一点(尽管没有检查字段的存在或类型)。
package main
import (
"bufio"
"fmt"
"reflect"
"strings"
)
type Entry struct {
Title string
Content string
Metadata string
Comments string
}
func main() {
var input string = `title:stack|content:overflow|metadata:53|comments:none
title:google|content:website|metadata:213|comments:Demos
`
var result = make(map[string]Entry)
scanner := bufio.NewScanner(strings.NewReader(input))
for scanner.Scan() {
data := scanner.Text()
data_arr := strings.Split(data, "|")
entry := Entry{}
for _, n := range data_arr {
data_subdoc := strings.Split(n, ":")
key, value := data_subdoc[0], data_subdoc[1]
fmt.Println(key, value)
field := strings.Title(key)
reflect.Indirect(reflect.ValueOf(&entry)).FieldByName(field).SetString(value)
}
result[entry.Metadata] = entry
}
fmt.Printf("%+v\n", result["53"])
fmt.Printf("%+v\n", result["213"])
}
关于regex - 逐行读取特定数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56257188/