Я пытаюсь прочитать данные из файла в определенном формате.
файл выглядит следующим образом
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')
@LutzHorn Я не могу получить отношение к заголовку, содержанию, метаданным и комментариям для каждой строки. Например, я хочу распечатать содержимое + комментарии вместе. В настоящее время я получаю контент и комментарии в виде отдельной строки (из-за цикла for). Так что никакие отношения невозможны, я думаю.
Соберите данные из каждой строки в тип struct
. Пусть этот тип реализует Stringer
. Распечатайте это.
Как предложил @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
это то, что мне нужно :)
Я не вижу никакой связи между результатом, который вы получаете, и результатом, который вы хотите создать. Каков ожидаемый результат для данного входа?