Чтение конкретных данных построчно

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

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

title:stack|content:overflow|metadata:53|comments:none
title:google|content:website|metadata:213|comments:Demos

Мне нужно прочитать это строка за строкой и назначьте переменную title со значением 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')

Я не вижу никакой связи между результатом, который вы получаете, и результатом, который вы хотите создать. Каков ожидаемый результат для данного входа?

user11044402 22.05.2019 15:14

@LutzHorn Я не могу получить отношение к заголовку, содержанию, метаданным и комментариям для каждой строки. Например, я хочу распечатать содержимое + комментарии вместе. В настоящее время я получаю контент и комментарии в виде отдельной строки (из-за цикла for). Так что никакие отношения невозможны, я думаю.

stackover flow 22.05.2019 15:21

Соберите данные из каждой строки в тип struct. Пусть этот тип реализует Stringer. Распечатайте это.

user11044402 22.05.2019 15:23
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
3
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как предложил @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"])
}

Спасибо. В моем случае result["53"].comments это то, что мне нужно :)

stackover flow 23.05.2019 17:04

Другие вопросы по теме