为了账号安全,请及时绑定邮箱和手机立即绑定

逐行读取特定数据

逐行读取特定数据

Go
肥皂起泡泡 2023-06-19 15:52:16
我正在尝试从特定格式的文件中读取数据。文件如下所示title:stack|content:overflow|metadata:53|comments:nonetitle: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 stackcontent overflowmetadata 53comments nonetitle googlecontent websitemetadata 213 comments Demos但是,我想要这样的东西:stack overflow 53if stack has 53:    print comments (in this case, its 'none')google website 213if google has 213, print content (In this case, its 'website')
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

为什么不将数据读入结构?下面的代码使用反射来做到这一点(尽管没有检查字段的存在或类型)。


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"])

}


查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信