regex - 逐行读取特定数据

标签 regex go

我正在尝试从特定格式的文件中读取数据。

文件如下所示

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/

相关文章:

go - 如何在 hyperledger fabric v0.6 链代码实现中查询一段时间的状态

c++ - regex_match 和 regex_search 之间的区别?

regex - 正则表达式 以小写字母开头,以小写字母或数字结尾,中间为小写字母、数字和下划线

go - 如何在Go中计算一个非常大的文件的SHA256?

go - 最简单的 Golang CGI 表单示例

logging - 如何向 io.MultiWriter 添加/删除按需编写器?

javascript - JavaScript 中的正则表达式替换

javascript - RegEx - 查找模式之间的字符串

regex - 带括号的电话号码的 HTML5 模式

go - 如何计算 golang 模板中列的总数?