I am trying to read data from a file in specific format.
file looks as follows
title:stack|content:overflow|metadata:53|comments:none
title:google|content:website|metadata:213|comments:Demos
I need to read this line by line and assign title variable with title
value ("stack"
), content with content
value ("overflow"
) for each line.
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)
But problem is I get data as (relation between title, content, metadata and comments for each line is missing)
title stack
content overflow
metadata 53
comments none
title google
content website
metadata 213
comments Demos
But, I want something like:
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')
As @LutzHorn suggested, why not read your data into a struct? The code below does that using reflection (though without checking for existence or type of field).
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
", result["53"])
fmt.Printf("%+v
", result["213"])
}