Читайте конкретные данные построчно - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь прочитать данные из файла в определенном формате.

файл выглядит следующим образом

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')

1 Ответ

0 голосов
/ 22 мая 2019

Как подсказал @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"])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...