Parsing 如何从ovs vsctl get接口解析结果<;界面>;统计数字

Parsing 如何从ovs vsctl get接口解析结果<;界面>;统计数字,parsing,go,Parsing,Go,结果示例: {collisions=0, rx_bytes=258, rx_crc_err=0, rx_dropped=0, rx_errors=0, rx_frame_err=0, rx_over_err=0, rx_packets=3, tx_bytes=648, tx_dropped=0, tx_errors=0, tx_packets=8} 这种格式类似于JSON,但不是JSON 有没有一种简单的方法可以将其解析为map[string]int?类似于json.Unmarshal(数据和

结果示例:

{collisions=0, rx_bytes=258, rx_crc_err=0, rx_dropped=0, rx_errors=0, rx_frame_err=0, rx_over_err=0, rx_packets=3, tx_bytes=648, tx_dropped=0, tx_errors=0, tx_packets=8}
这种格式类似于JSON,但不是JSON


有没有一种简单的方法可以将其解析为
map[string]int
?类似于
json.Unmarshal(数据和值)

如果传输格式不是递归定义的,即键不能启动子结构,则其语言是。因此,您可以使用Go的标准
regexp
包对其进行合理的解析:


@thwd的Regexp是一个优雅的解决方案

您可以使用按逗号空间(
“,”
)拆分以获得对,然后再次按等号(
“=”
)拆分以获得键值对,从而获得更有效的解决方案。之后,您只需将这些内容放入地图:

func Parse(s string) (m map[string]int, err error) {
    if len(s) < 2 || s[0] != '{' || s[len(s)-1] != '}' {
        return nil, fmt.Errorf("Invalid input, no wrapping brackets!")
    }

    m = make(map[string]int)
    for _, v := range strings.Split(s[1:len(s)-1], ", ") {
        parts := strings.Split(v, "=")
        if len(parts) != 2 {
            return nil, fmt.Errorf("Equal sign not found in: %s", v)
        }
        if m[parts[0]], err = strconv.Atoi(parts[1]); err != nil {
            return nil, err
        }
    }
    return
}
试穿一下

注意:如果性能很重要,可以通过不在外部循环中使用
strings.Split()
来改进性能,而是“手动”搜索逗号并维护索引,并且只“取出”表示实际键和值的子字符串(但此解决方案会更复杂)

另一个解决方案。。。 …但此选项的速度要慢得多,因此只有在性能不是关键要求时才可行:您可以将输入字符串转换为有效的JSON格式,然后才能使用。省略错误检查:

s := "{collisions=0, rx_bytes=258, ...}"

// Turn into valid JSON:
s = strings.Replace(s, `=`, `":`, -1)
s = strings.Replace(s, `, `, `, "`, -1)
s = strings.Replace(s, `{`, `{"`, -1)

// And now simply unmarshal:
m := make(map[string]int)
json.Unmarshal([]byte(s), &m)
fmt.Println(m)
此解决方案的优点是,如果取消匹配的目标值是一个
结构
,则此方法也有效:

// Unmarshal into a struct (you don't have to care about all fields)
st := struct {
    Collisions int `json:"collisions"`
    Rx_bytes   int `json:"rx_bytes"`
}{}
json.Unmarshal([]byte(s), &st)
fmt.Printf("%+v\n", st)
试穿这些衣服

s := "{collisions=0, rx_bytes=258, ...}"

// Turn into valid JSON:
s = strings.Replace(s, `=`, `":`, -1)
s = strings.Replace(s, `, `, `, "`, -1)
s = strings.Replace(s, `{`, `{"`, -1)

// And now simply unmarshal:
m := make(map[string]int)
json.Unmarshal([]byte(s), &m)
fmt.Println(m)
// Unmarshal into a struct (you don't have to care about all fields)
st := struct {
    Collisions int `json:"collisions"`
    Rx_bytes   int `json:"rx_bytes"`
}{}
json.Unmarshal([]byte(s), &st)
fmt.Printf("%+v\n", st)